この記事は公開から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();
}
}
出力
本サンプルではIEnumerable.Chunk()
の動作に合わせるためにチャンクの実体化ToArray()
を行っていますが、用途によっては遅延評価のままでも良いかと思います。
参考ウェブサイトなど
-
MicrosoftLearn
Enumerable.Chunk(IEnumerable , Int32) メソッド -
Microsoft .NET Source Browser
Chunk.cs
以上です。