[C#][VB] LINQでコレクションをチャンク(N個ずつ)に分割

[C#][VB] LINQでコレクションをチャンク(N個ずつ)に分割

LINQでチャンク

チャンクとは、大きな塊、ぶつ切り、大量、などの意味を持つ英単語です。つまりひとまとまりのデータの塊を指します。

例えば配列などのコレクションに対して、N個ずつの要素のチャンクまとめて処理を行いたい場合があります。100個の要素を持つコレクションを2個の要素をもつチャンク50個に分割するイメージです。これを拡張メソッドとして用意しておけば便利なはずです。

拡張メソッドやイテレータについては以下の記事にまとめています。

Chanks

C#

public static class Extensions
{
    // 指定サイズのチャンクに分割する拡張メソッド
    public static IEnumerable<IEnumerable<T>> Chunks<T>
    (this IEnumerable<T> list, int size)
    {
        while (list.Any())
        {
            yield return list.Take(size);
            list = list.Skip(size);
        }
    }
}

VB.NET

Module Extensions
    ' 指定サイズのチャンクに分割する拡張メソッド
    <Extension()>
    Public Iterator Function Chunks(Of T)(ByVal list As IEnumerable(Of T), ByVal size As Integer) As IEnumerable(Of IEnumerable(Of T))
        While list.Any
            Yield list.Take(size)
            list = list.Skip(size)
        End While
    End Function
End Module

Chunksの仕組み

対象のコレクションに要素が存在すれば、引数のサイズ分の要素を取り出したコレクション作成し列挙子として返しています。分割して作成されたコレクションのコレクションです。

マイナスのサイズを渡すとエラーになりますが、大きな値では問題ありません。

使い方

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main(string[] args)
    {
        var data = new string[] { "A", "B", "C", "D", "E", "F", "G" };
        foreach (var chunk in data.Chunks(3))
        {
            Console.WriteLine(string.Join(", ", chunk));
        }
    }
}
public static class Extensions
{
    // 指定サイズでのチャンクに分割する拡張メソッド
    public static IEnumerable<IEnumerable<T>> Chunks<T>(this IEnumerable<T> list, int size)
    {
        while (list.Any())
        {
            yield return list.Take(size);
            list = list.Skip(size);
        }
    }
}

Linqカテゴリの最新記事