【C#】配列をN個に分割する

文字列をSplitで分割する処理は割と見かけますが、ある配列を複数の配列に分割する処理はあまり見かけたことが無いので書きました。

例えば10個の要素の配列を3個ずつの配列に分割して 3 + 3 + 3 + 1要素の配列に分割する場合の処理方法です。

確認環境

以下の環境で確認してます。

  • VisualStudio2019
  • .NET5, C# 9.0

実行コード

private static T[][] SplitArray<T>(T[] list, int maxLen)
{
    int len = list.Length / maxLen;
    if (list.Length % maxLen != 0)
    {
        len++;
    }

    var retList = new T[len][];
    for (int i = 0, p = 0, q =0; i < list.Length; i++, p++)
    {
        if (p >= maxLen)
        {
            p = 0;
            q++;
        }

        if (p == 0)
        {
            retList[q] = 
                (list.Length - i - maxLen < 0) ? 
                    new T[list.Length - i] : 
                    new T[maxLen];
        }

        retList[q][p] = list[i];
    }

    return retList;
}

動作確認

private static void Main(string[] args)
{
    // データ生成
    IEnumerable<string> f(int count)
    {
        for (int i = 0; i < count; i++)
        {
            yield return i.ToString("D5");
        }
    }

    // 分割
    var items = SplitArray(f(10).ToArray(), 3);
    if (items is null)
    {
        return;
    }

    // 結果出力
    for (int i = 0; i < items.Length; i++)
    {
        for (int j = 0; j < items[i].Length; j++)
        {
            Console.WriteLine($"[{i}][{j}]={items[i][j]}");
            // [0][0]=00000
            // [0][1]=00001
            // [0][2]=00002
            // [1][0]=00003
            // [1][1]=00004
            // [1][2]=00005
            // [2][0]=00006
            // [2][1]=00007
            // [2][2]=00008
            // [3][0]=00009

            // 3 + 3 + 3 + 1 に分割されている
        }
    }
}

書いてて思いましたが、事前にデータ構造を整理するような用途以外では使わないかもしれませんね。

短いですが以上です。