Вам лучше использовать такую библиотеку, как 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
просто уменьшает IGrouping<>
до IEnumerable<IEnumerable<T>>
(и не является строго необходимым, поскольку IGrouping
- это IEnumerable
).
Достаточно легко превратить это в метод многократного использования, факторизовав нашу константу 8
в примере и заменив ее указанным параметром. Это не обязательно самое элегантное решение, и это уже не ленивое потоковое решение ... но оно действительно работает.
Вы также можете написать свой собственный метод расширения, используя блоки итераторов (yield return
), которые могут дать вам лучшую производительность и использовать меньше памяти, чем GroupBy
. Это то, что Batch()
метод MoreLinq делает IIRC.
person
LBushkin
schedule
22.09.2010