2022年10月6日木曜日

ListをN等分に分割する

100件のリストを20件単位に分割する方法はすぐに見つかるのだけど、

100件のリストを5等分する方法が見つからなかったので覚書き。


まずはよく見かける、20件ずつに分割する場合

List<string> list = new List<string>(){"あああ", "いいい", "ううう" ・・・ 100個くらい};

var chunks = list.Select((value, index) => new { value, index }).GroupBy(rec => rec.index / 20).Select(rec => rec.value));
    

これで、chunkは20件ずつの5等分されます。

少し説明をすると

まずは

Select( (value, index) => new { value, index })

で、インデックス付きのクラスのインスタンスを作成しています。

{"あああ", 0}

{"いいい", 1}

{"ううう", 2}

・・・という感じになります。


次に

GroupBy(rec => rec.index / 20)

で、インデックス÷3の商が同じもののみでグループ化します。


最後に

Select(rec => rec.value)

で、インデックスなしの元の値を取得しています。


このソースは、100件のリストを20件ずつに分割する方法でした。


じゃあ、100件のリストを5個に分する場合は・・・

GroupBy(rec => rec.index % 5)

とすることで、インデックス÷3の余りが同じもののみでグループ化できます。