267 votes

Découpage d'une chaîne de caractères en morceaux d'une certaine taille

Supposons que j'ai une chaîne de caractères :

string str = "1111222233334444"; 

Comment puis-je diviser cette chaîne en morceaux d'une certaine taille ?

Par exemple, le découpage en tailles de 4 renverrait des chaînes de caractères :

"1111"
"2222"
"3333"
"4444"

298voto

Konstantin Spirin Points 5347
static IEnumerable<string> Split(string str, int chunkSize)
{
    return Enumerable.Range(0, str.Length / chunkSize)
        .Select(i => str.Substring(i * chunkSize, chunkSize));
}

173voto

Eamon Nerbonne Points 21663

Dans une combinaison de réponses de Colombe+Konstatin...

static IEnumerable<string> WholeChunks(string str, int chunkSize) {
    for (int i = 0; i < str.Length; i += chunkSize) 
        yield return str.Substring(i, chunkSize);
}

Cela fonctionnera pour toutes les chaînes de caractères qui peuvent être divisées en un nombre entier de morceaux, sinon une exception sera levée.

Si vous souhaitez prendre en charge les chaînes de caractères de toute longueur, vous pouvez utiliser le code suivant :

static IEnumerable<string> ChunksUpto(string str, int maxChunkSize) {
    for (int i = 0; i < str.Length; i += maxChunkSize) 
        yield return str.Substring(i, Math.Min(maxChunkSize, str.Length-i));
}

Cependant, le PO a explicitement déclaré qu'il n'en avait pas besoin ; c'est un peu plus long et plus difficile à lire, légèrement plus lent. Dans l'esprit de KISS et YAGNI, je choisirais la première option : c'est probablement l'implémentation la plus efficace possible, et elle est très courte, lisible, et lève une exception pour les entrées non conformes.

63voto

dove Points 12456

Pourquoi pas des boucles ? Voici quelque chose qui ferait très bien l'affaire :

        string str = "111122223333444455";
        int chunkSize = 4;
        int stringLength = str.Length;
        for (int i = 0; i < stringLength ; i += chunkSize)
        {
            if (i + chunkSize > stringLength) chunkSize = stringLength  - i;
            Console.WriteLine(str.Substring(i, chunkSize));

        }
        Console.ReadLine();

Je ne sais pas comment vous traitez le cas où la chaîne n'est pas un facteur 4, mais je ne dis pas que votre idée n'est pas possible, je me demande juste ce qui la motive si une simple boucle for le fait très bien ? Évidemment, ce qui précède pourrait être nettoyé et même mis dans une méthode d'extension.

Ou comme mentionné dans les commentaires, vous savez que c'est /4 alors

str = "1111222233334444";
for (int i = 0; i < stringLength; i += chunkSize) 
  {Console.WriteLine(str.Substring(i, chunkSize));}

47voto

oleksii Points 17099

Ceci est basé sur Solution @dove mais mis en œuvre comme une méthode d'extension.

Avantages :

  • Méthode d'extension
  • Couvre les cas de coin
  • Divise la chaîne de caractères avec tous les caractères : chiffres, lettres, autres symboles.

Code

public static class EnumerableEx
{    
    public static IEnumerable<string> SplitBy(this string str, int chunkLength)
    {
        if (String.IsNullOrEmpty(str)) throw new ArgumentException();
        if (chunkLength < 1) throw new ArgumentException();

        for (int i = 0; i < str.Length; i += chunkLength)
        {
            if (chunkLength + i > str.Length)
                chunkLength = str.Length - i;

            yield return str.Substring(i, chunkLength);
        }
    }
}

Utilisation

string[] result = "bobjoecat".SplitBy(3); // [bob, joe, cat]

Tests unitaires supprimés par souci de concision (voir précédente révision )

44voto

João Silva Points 36619

Utilisation de expressions régulières y Linq :

List<string> groups = (from Match m in Regex.Matches(str, @"\d{4}")
                       select m.Value).ToList();

Je trouve cela plus lisible, mais ce n'est qu'une opinion personnelle. Il peut aussi s'agir d'une simple phrase : ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X