从字符串到锯齿状的字符数组

From string to jagged array of chars

如果不使用 LINQ,我该如何解决这个问题?

我有一个字符串:string stringContent = "Loremipsumdolorsitamet";

和行的大小(最大列):int arraySize = 5;

然后我必须得到这个结果:

{
    { 'L', 'o', 'r', 'e', 'm' },
    { 'i', 'p', 's', 'u', 'm' },
    { 'd', 'o', 'l', 'o', 'r' },
    { 's', 'i', 't', 'a', 'm' },
    { 'e', 't' }
}

到目前为止我的代码:

  static void Main(string[] args)
        {
            int arraySize = 5;
            string stringContent = "Loremipsumdolorsitamet";
            int length = stringContent.Length / arraySize;
            char[][] save = new char[length + 1][]; // Length + 1 is for the extra lien at the end F.E 'e' 't'

            
            int charIndex = 0; // this is fo
            for (int i = 0; i < length; i++)
            {
                char[] line = new char[arraySize - 1];
                int j = 1;
                while (j <= arraySize)
                {
                    if (charIndex < stringContent.Length)
                    {
                        line[j] = stringContent[charIndex]; 
                        charIndex++;
                    }

                    j++;
                }

                save[i] = line;
            }

            for (int i = 0; i < length; i++)
            {
                for (int k = 0; k < arraySize; k++)
                {
                    Console.Write(save[i][k]);
                }

                Console.WriteLine();
            }
        }

.Net 6,目前可作为候选发布版本使用,但预计现在任何时候都会正式发布,将有 IEnumerable<T>.Chunk():

var result = stringContent.Chunk(5);
foreach(char[] segment in result)
{
    foreach(char c in segment)
    {
        Console.Write(c);
    }
    Console.WriteLine();
}

现在我知道一个未发布的方法可能对您没有帮助,尤其是当您要求不使用 linq 时。但是it's not really linq if you implement the method yourself:

public static IEnumerable<T[]> Chunk<T>(this IEnumerable<T> values, int chunkSize)
{
    T[] items = new T[chunkSize];
    int i = 0;
    var e = values.GetEnumerator();
    while (e.MoveNext())
    {
        items[i] = e.Current;
        i++;

        if (i == chunkSize) {
            yield return items;
            items = new T[chunkSize];
            i = 0;
       }
    }
    if (i != 0) //partial array remaining
    { 
       T[] final = new T[i];
       while (i>0) final[--i] = items[i];
       yield return final;
    }
}

看到它在这里工作...

https://dotnetfiddle.net/r5YAZV

... 并注意顶部缺少​​ using System.Linq;

根据要求,没有 LINQ,使用 .Net 的更简单版本 API:

    class Program
    {
        static void Main(string[] args)
        {
            char[][] result = ToArrays("Loremipsumdolorsitamet", 5);
            WriteResult(result, Console.Out);
        }

        private static char[][] ToArrays(string text, int arraySize)
        {
            var arrs = new List<char[]>();

            while (!string.IsNullOrEmpty(text))
            {
                int len = Math.Min(arraySize, text.Length);
                string chunk = text.Substring(0, len);
                text = text.Substring(len);
                arrs.Add(chunk.ToCharArray());
            }

            return arrs.ToArray();
        }

        private static void WriteResult(char[][] result, TextWriter writer)
        {
            writer.WriteLine("{");
            foreach (char[] arr in result)
            {
                writer.Write("\t{ '");
                writer.Write(string.Join("', '", arr));
                writer.WriteLine("' }");
            }
            writer.WriteLine("}");
        }
    }