C#LINQ优雅地将IEnumerable <igrouping>转换为IEnumerable <ienumerable>?

时间:2018-03-15 23:39:18

标签: c# linq ienumerable igrouping

如果您有IEnumerable<IGrouping<T>>,请说

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

是否有更好的方法(很少使用LINQ方法/变体)转换为IEnumerable<IEnumerable<T>>然后嵌套Select,如下所示:

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

对于那些不理解的人,

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

应该返回anst == true

2 个答案:

答案 0 :(得分:1)

避免嵌套选择的一种解决方案是使用AsEnumerable()方法。

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

答案 1 :(得分:1)

在这种情况下,IGrouping已经实现了该接口:

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;
    }
}