.NET FrameworkでEnumerable.Chunk()を利用する方法

この記事は公開から2年以上経過しています。

データを最大n個のデータの塊(チャンク)に分割することが可能な.NET 6以降のLINQメソッドEnumerable<T>.Chunk(size)相当の処理を.NET Frameworkで使うための拡張メソッドを作ってみたので紹介します。

この拡張メソッドを利用すると

{1, 2, 3, 4, 5, 6}

のような連続した配列データを例えば2個毎に

{{1, 2}, {3, 4}, {5, 6}}

のような形に分割する事が可能です。


サンプルソースコード

C#

public static class Utilities
{
    public static IEnumerable<T[]> Chunk<T>(this IEnumerable<T> source, int size)
    {
        int num = source.Count();
        for (int i = 0; i < num; i += size)
        {
            var chunk = source.Skip(i).Take(size).ToArray();
            if (chunk == null)
                yield break;
            yield return chunk;
        }
    }
}

VB.NET

Public Module Utilities

    <Extension()>
    Public Iterator Function Chunk(Of T)(source As IEnumerable(Of T), size As Integer) As IEnumerable(Of T())

        Dim num = source.Count()
        For i = 0 To num - 1 Step size
            Dim _chunk = source.Skip(i).Take(size).ToArray()
            If _chunk Is Nothing Then Return
            Yield _chunk
        Next

    End Function

End Module


結果

動作検証コード(C#)

internal class Program
{
    private static void Main(string[] args)
    {
        var v1 = new[] { 1, 2, 3, 4, 5, 6 }.Chunk(1).ToArray();
        var v2 = new[] { 1, 2, 3, 4, 5, 6 }.Chunk(3).ToArray();
        var v3 = new[] { 1, 2, 3, 4, 5, 6 }.Chunk(5).ToArray();
        var v4 = new[] { 1, 2, 3, 4, 5, 6 }.Chunk(6).ToArray();
    }
}

出力

file

本サンプルではIEnumerable.Chunk()の動作に合わせるためにチャンクの実体化ToArray()を行っていますが、用途によっては遅延評価のままでも良いかと思います。


参考ウェブサイトなど

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする