Splitting a string into chunks of a certain size

后端 未结 30 2045
时光说笑
时光说笑 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:01

    I recently had to write something that accomplishes this at work, so I thought I would post my solution to this problem. As an added bonus, the functionality of this solution provides a way to split the string in the opposite direction and it does correctly handle unicode characters as previously mentioned by Marvin Pinto above. So, here it is:

    using System;
    using Extensions;
    
    namespace TestCSharp
    {
        class Program
        {
            static void Main(string[] args)
            {    
                string asciiStr = "This is a string.";
                string unicodeStr = "これは文字列です。";
    
                string[] array1 = asciiStr.Split(4);
                string[] array2 = asciiStr.Split(-4);
    
                string[] array3 = asciiStr.Split(7);
                string[] array4 = asciiStr.Split(-7);
    
                string[] array5 = unicodeStr.Split(5);
                string[] array6 = unicodeStr.Split(-5);
            }
        }
    }
    
    namespace Extensions
    {
        public static class StringExtensions
        {
            /// Returns a string array that contains the substrings in this string that are seperated a given fixed length.
            /// This string object.
            /// Size of each substring.
            ///     CASE: length > 0 , RESULT: String is split from left to right.
            ///     CASE: length == 0 , RESULT: String is returned as the only entry in the array.
            ///     CASE: length < 0 , RESULT: String is split from right to left.
            /// 
            /// String array that has been split into substrings of equal length.
            /// 
            ///     
            ///         string s = "1234567890";
            ///         string[] a = s.Split(4); // a == { "1234", "5678", "90" }
            ///     
            ///             
            public static string[] Split(this string s, int length)
            {
                System.Globalization.StringInfo str = new System.Globalization.StringInfo(s);
    
                int lengthAbs = Math.Abs(length);
    
                if (str == null || str.LengthInTextElements == 0 || lengthAbs == 0 || str.LengthInTextElements <= lengthAbs)
                    return new string[] { str.ToString() };
    
                string[] array = new string[(str.LengthInTextElements % lengthAbs == 0 ? str.LengthInTextElements / lengthAbs: (str.LengthInTextElements / lengthAbs) + 1)];
    
                if (length > 0)
                    for (int iStr = 0, iArray = 0; iStr < str.LengthInTextElements && iArray < array.Length; iStr += lengthAbs, iArray++)
                        array[iArray] = str.SubstringByTextElements(iStr, (str.LengthInTextElements - iStr < lengthAbs ? str.LengthInTextElements - iStr : lengthAbs));
                else // if (length < 0)
                    for (int iStr = str.LengthInTextElements - 1, iArray = array.Length - 1; iStr >= 0 && iArray >= 0; iStr -= lengthAbs, iArray--)
                        array[iArray] = str.SubstringByTextElements((iStr - lengthAbs < 0 ? 0 : iStr - lengthAbs + 1), (iStr - lengthAbs < 0 ? iStr + 1 : lengthAbs));
    
                return array;
            }
        }
    }
    

    Also, here is an image link to the results of running this code: http://i.imgur.com/16Iih.png

提交回复
热议问题