C# LINQ convert IEnumerable<IGrouping> to IEnumerable<IEnumerable> elegantly?

1.7k Views Asked by At

If you have an IEnumerable<IGrouping<K, T>>, say from

var ans = src.GroupBy(s => s.Field);

Is there a better way (rarely used LINQ method/variation) to convert to an IEnumerable<IEnumerable<T>> then nested Selects like so:

var ans2 = ans.Select(g => g.Select(s => s));

For those that aren't understanding,

var anst = ans2.Select(g => g.GetType().ReflectedType).All(t => t == typeof(Enumerable));

should return anst == true.

2

There are 2 best solutions below

5
Ousmane D. On

One solution to avoid the nested select is using the AsEnumerable() method.

var ans = src.GroupBy(s => s.Field).Select(e => e.AsEnumerable());
9
Jason On

In this case IGrouping already implements that interface:

public static class Program
{
    static void Main(string[] args)
    {
        var foo = new[] {
            new MyClass { a = "1", b = "2"},
            new MyClass { a = "1", b = "3"},
            new MyClass { a = "2", b = "4"},
            new MyClass { a = "2", b = "5"} };

        var ans = foo.GroupBy(x => x.a);

        IEnumerable<IEnumerable<MyClass>> ans2 = ans;
        IEnumerable<IEnumerable<MyClass>> result = ans2.ToArray();
    }

    private class MyClass
    {
        public string a;
        public string b;
    }
}