MoreLinqのようなライブラリを使用する方が良いですが、本当に「プレーンLINQ」を使用してこれを行う必要がある場合は、次を使用できますGroupBy
。
var sequence = new[] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
var result = sequence.Select((x, i) => new {Group = i/8, Value = x})
.GroupBy(item => item.Group, g => g.Value)
.Select(g => g.Where(x => true));
// result is: { {1,2,3,4,5,6,7,8}, {9,10,11,12,13,14,15,16} }
基本的に、Select()
消費されている値のインデックスを提供するバージョンを使用し、インデックスを8で割って、各値が属するグループを識別します。次に、このグループ化キーによってシーケンスをグループ化します。最後は、ダウンをSelect
aに減らすだけです(であるため、厳密には必要ありません)。IGrouping<>
IEnumerable<IEnumerable<T>>
IGrouping
IEnumerable
8
例の定数を因数分解し、指定されたパラメーターに置き換えることで、これを再利用可能なメソッドに変えるのは簡単です。これは必ずしも最も洗練されたソリューションではなく、もはや怠惰なストリーミングソリューションではありません...しかし、それは機能します。
イテレータブロック(yield return
)を使用して独自の拡張メソッドを作成することもできます。これにより、パフォーマンスが向上し、使用するメモリが。より少なくなりますGroupBy
。これは、MoreLinqのBatch()
メソッドがIIRCを実行する方法です。