Felipe Lima Felipe Lima - 1 month ago 34
C# Question

Split List into Sublists with LINQ

Is there any way I can separe a List into several separate lists of SomeObject, using the item index as the delimiter of each split?

Let me exemplify:
I have a

List<SomeObject>
and I need a
List<List<SomeObject>>
or
List<SomeObject>[]
, so that each of these resulting lists will contain a group of 3 items of the original list (sequentially).

eg.:
Original List:
[a, g, e, w, p, s, q, f, x, y, i, m, c]


Resulting lists:
[a, g, e], [w, p, s], [q, f, x], [y, i, m], [c]


I'd also need the resulting lists size to be a parameter of this function.

Is it possible??

Answer

Try the following code.

public static IList<IList<T>> Split<T>(IList<T> source)
{
    return  source
        .Select((x, i) => new { Index = i, Value = x })
        .GroupBy(x => x.Index / 3)
        .Select(x => x.Select(v => v.Value).ToList())
        .ToList();
}

The idea is to first group the elements by indexes. Dividing by three has the effect of grouping them into groups of 3. Then convert each group to a list and the IEnumerable of List to a List of Lists