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"

4voto

HoloEd Points 21
public static IEnumerable<IEnumerable<T>> SplitEvery<T>(this IEnumerable<T> values, int n)
{
    var ls = values.Take(n);
    var rs = values.Skip(n);
    return ls.Any() ?
        Cons(ls, SplitEvery(rs, n)) : 
        Enumerable.Empty<IEnumerable<T>>();
}

public static IEnumerable<T> Cons<T>(T x, IEnumerable<T> xs)
{
    yield return x;
    foreach (var xi in xs)
        yield return xi;
}

2voto

Modifié légèrement pour retourner les parties dont la taille n'est pas égale à chunkSize

public static IEnumerable<string> Split(this string str, int chunkSize)
    {
        var splits = new List<string>();
        if (str.Length < chunkSize) { chunkSize = str.Length; }
        splits.AddRange(Enumerable.Range(0, str.Length / chunkSize).Select(i => str.Substring(i * chunkSize, chunkSize)));
        splits.Add(str.Length % chunkSize > 0 ? str.Substring((str.Length / chunkSize) * chunkSize, str.Length - ((str.Length / chunkSize) * chunkSize)) : string.Empty);
        return (IEnumerable<string>)splits;
    }

2voto

Seth Points 31

Une astuce importante si la chaîne de caractères qui est mise en morceaux doit supporter tous les caractères Unicode.

Si la chaîne doit prendre en charge des caractères internationaux tels que

1voto

Denis Points 4290

Je me suis légèrement inspiré de la solution de João. Ce que j'ai fait différemment, c'est que dans ma méthode, vous pouvez spécifier si vous voulez renvoyer le tableau avec les caractères restants ou si vous voulez les tronquer si les caractères de fin ne correspondent pas à la longueur de morceau requise, je pense que c'est assez flexible et le code est assez simple :

using System;
using System.Linq;
using System.Text.RegularExpressions;

namespace SplitFunction
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "hello, how are you doing today?";
            string[] chunks = SplitIntoChunks(text, 3,false);
            if (chunks != null)
            {
                chunks.ToList().ForEach(e => Console.WriteLine(e));
            }

            Console.ReadKey();
        }

        private static string[] SplitIntoChunks(string text, int chunkSize, bool truncateRemaining)
        {
            string chunk = chunkSize.ToString(); 
            string pattern = truncateRemaining ? ".{" + chunk + "}" : ".{1," + chunk + "}";

            string[] chunks = null;
            if (chunkSize > 0 && !String.IsNullOrEmpty(text))
                chunks = (from Match m in Regex.Matches(text,pattern)select m.Value).ToArray(); 

            return chunks;
        }     
    }
}

1voto

Rikin Patel Points 1314
    public static List<string> SplitByMaxLength(this string str)
    {
        List<string> splitString = new List<string>();

        for (int index = 0; index < str.Length; index += MaxLength)
        {
            splitString.Add(str.Substring(index, Math.Min(MaxLength, str.Length - index)));
        }

        return splitString;
    }

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