PR

[C# LINQ]要素をN個ずつにまとめる(chunk)

C#10(.NET6)からLINQに新しい追加されたchunkメソッドを使うと配列やリストの要素をn個ずつまとめることができます。前から要望があった機能がついに追加されました。
この記事ではchunkメソッドの使い方を紹介します。また、C#10より前のバージョンでchunkメソッドと同じようなことをするにはどうするかを紹介します。

スポンサーリンク

chunkメソッドの使い方

chunkメソッドの引数には何個毎にまとめるかを指定します。
chunkメソッドの戻り値は指定された個数にまとめられたコレクションをもつコレクションです。
また最後に余った要素は指定された個数より少ない数でまとめられます。
サンプルでは10個の要素を3個ずつにまとめています。最後の要素(チャンク)だけ要素数1になる。

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

namespace TestProject;
class Program 
{
    static void Main(string[] args)
    {
        //データソース
        List<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        //listを3つずつに分割する
        foreach (var chunk in list.Chunk(3)) {
            Console.WriteLine("chank data-----");
            foreach (var element in chunk) {
                Console.WriteLine(element);
            }
        }
    }
}
chank data-----
1
2
3
chank data-----
4
5
6
chank data-----
7
8
9
chank data-----
10
スポンサーリンク

C#9.0以前でchunk機能を実現するには

Linq(IEnumerable)の拡張メソッドとしてchunkメソッドを自作して同じようなことをします。
こんな感じ、

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

namespace linq_chunk {
    class Program {
        static void Main(string[] args)
        {
            var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            //listを3つずつに分割する
            foreach (var chunk in list.Chunk(3)) {
                Console.WriteLine("chank data-----");
                foreach (var element in chunk) {
                    Console.WriteLine(element);
                }
            }
        }
    }

    public static class LinqExtensions {
        //IEnumerableの拡張メソッド、指定された個数で要素をまとめて返す
        public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> source, int chunksize)
        {
            if (chunksize <= 0) throw new ArgumentException();
            var loopCount = source.Count() / chunksize + (source.Count() % chunksize > 0 ? 1 : 0);
            foreach (var i in Enumerable.Range(0, loopCount)) {
                yield return source.Skip(chunksize * i).Take(chunksize);
            }
        }
    }
}
chank data-----
1
2
3
chank data-----
4
5
6
chank data-----
7
8
9
chank data-----
10

C# 記事まとめページに戻る(他のサンプルコードもこちら)

C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。

コメント