Split a collection into `n` parts with LINQ?


Is there a nice way to split a collection into n parts with LINQ? Not necessarily evenly of course.

That is, I want to divide the collection into sub-collections, which each contains a subset of the elements, where the last collection can be ragged.

5/20/2017 7:34:50 PM

Accepted Answer

A pure linq and the simplest solution is as shown below.

static class LinqExtensions
    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> list, int parts)
        int i = 0;
        var splits = from item in list
                     group item by i++ % parts into part
                     select part.AsEnumerable();
        return splits;
5/20/2017 7:31:12 PM

EDIT: Okay, it looks like I misread the question. I read it as "pieces of length n" rather than "n pieces". Doh! Considering deleting answer...

(Original answer)

I don't believe there's a built-in way of partitioning, although I intend to write one in my set of additions to LINQ to Objects. Marc Gravell has an implementation here although I would probably modify it to return a read-only view:

public static IEnumerable<IEnumerable<T>> Partition<T>
    (this IEnumerable<T> source, int size)
    T[] array = null;
    int count = 0;
    foreach (T item in source)
        if (array == null)
            array = new T[size];
        array[count] = item;
        if (count == size)
            yield return new ReadOnlyCollection<T>(array);
            array = null;
            count = 0;
    if (array != null)
        Array.Resize(ref array, count);
        yield return new ReadOnlyCollection<T>(array);

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow