Splitting a string into chunks of a certain size

后端 未结 30 1544
时光说笑
时光说笑 2020-11-22 07:55

Suppose I had a string:

string str = \"1111222233334444\"; 

How can I break this string into chunks of some size?

e.g., breaking t

相关标签:
30条回答
  • 2020-11-22 08:14
    static List<string> GetChunks(string value, int chunkLength)
    {
        var res = new List<string>();
        int count = (value.Length / chunkLength) + (value.Length % chunkLength > 0 ? 1 : 0);
        Enumerable.Range(0, count).ToList().ForEach(f => res.Add(value.Skip(f * chunkLength).Take(chunkLength).Select(z => z.ToString()).Aggregate((a,b) => a+b)));
        return res;
    }
    

    demo

    0 讨论(0)
  • 2020-11-22 08:15

    How's this for a one-liner?

    List<string> result = new List<string>(Regex.Split(target, @"(?<=\G.{4})", RegexOptions.Singleline));
    

    With this regex it doesn't matter if the last chunk is less than four characters, because it only ever looks at the characters behind it.

    I'm sure this isn't the most efficient solution, but I just had to toss it out there.

    0 讨论(0)
  • 2020-11-22 08:15

    Changed slightly to return parts whose size not equal to 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;
        }
    
    0 讨论(0)
  • 2020-11-22 08:16

    Why not loops? Here's something that would do it quite well:

            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();
    

    I don't know how you'd deal with case where the string is not factor of 4, but not saying you're idea is not possible, just wondering the motivation for it if a simple for loop does it very well? Obviously the above could be cleaned and even put in as an extension method.

    Or as mentioned in comments, you know it's /4 then

    str = "1111222233334444";
    for (int i = 0; i < stringLength; i += chunkSize) 
      {Console.WriteLine(str.Substring(i, chunkSize));} 
    
    0 讨论(0)
  • 2020-11-22 08:16

    This is based on @dove solution but implemented as an extension method.

    Benefits:

    • Extension method
    • Covers corner cases
    • Splits string with any chars: numbers, letters, other symbols

    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);
            }
        }
    }
    

    Usage

    var result = "bobjoecat".SplitBy(3); // bob, joe, cat
    

    Unit tests removed for brevity (see previous revision)

    0 讨论(0)
  • 2020-11-22 08:18

    Best , Easiest and Generic Answer :).

        string originalString = "1111222233334444";
        List<string> test = new List<string>();
        int chunkSize = 4; // change 4 with the size of strings you want.
        for (int i = 0; i < originalString.Length; i = i + chunkSize)
        {
            if (originalString.Length - i >= chunkSize)
                test.Add(originalString.Substring(i, chunkSize));
            else
                test.Add(originalString.Substring(i,((originalString.Length - i))));
        }
    
    0 讨论(0)
提交回复
热议问题