Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#LINQ convert IEnumerable<;i分组>;到IEnumerable<;IEnumerable>;优雅?_C#_Linq_Ienumerable_Igrouping - Fatal编程技术网

C#LINQ convert IEnumerable<;i分组>;到IEnumerable<;IEnumerable>;优雅?

C#LINQ convert IEnumerable<;i分组>;到IEnumerable<;IEnumerable>;优雅?,c#,linq,ienumerable,igrouping,C#,Linq,Ienumerable,Igrouping,如果您有一个IEnumerable,请说出from var ans = src.GroupBy(s => s.Field); 是否有更好的方法(很少使用的LINQ方法/变体)转换为IEnumerable然后嵌套Selects,如下所示: var ans2 = ans.Select(g => g.Select(s => s)); 对于那些不理解的人 var anst = ans2.Select(g => g.GetType().ReflectedType).All(t

如果您有一个
IEnumerable
,请说出from

var ans = src.GroupBy(s => s.Field);
是否有更好的方法(很少使用的LINQ方法/变体)转换为
IEnumerable
然后嵌套
Select
s,如下所示:

var ans2 = ans.Select(g => g.Select(s => s));
对于那些不理解的人

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

应返回
anst==true

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

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

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

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;
    }
}
公共静态类程序
{
静态void Main(字符串[]参数)
{
var foo=new[]{
新的MyClass{a=“1”,b=“2”},
新的MyClass{a=“1”,b=“3”},
新的MyClass{a=“2”,b=“4”},
新的MyClass{a=“2”,b=“5”};
var ans=foo.GroupBy(x=>x.a);
IEnumerable ans2=ans;
IEnumerable result=ans2.ToArray();
}
私有类MyClass
{
公共字符串a;
公共字符串b;
}
}

为什么要将结果强制转换为数组?结果是
IGrouping.Cast()
返回
IGrouping
。ToArray将强制执行IEnumerable的枚举,因此如果出现错误,我将看到抛出异常。在这一行之前,没有任何分组或强制转换代码会实际执行任何工作。NetMage,Cast返回IEnumerable-T对象也可能碰巧实现了IGrouping,但这与此处无关。您可以编写IEnumerable ans2,而不是上面的var ans2,它工作得很好。我编辑了我的答案,删除了变量,使之更加清晰。@NetMage:没错。
IEnumerable
已经是
IEnumerable
。您想要的转换是内置于语言中的,因此不清楚您想要的是什么。您已经得到了它。结果是
iGroup.AsEnumerable()
返回
iGroup
。谁知道呢?@NetMage是的,
IGrouping.AsEnumerable()
返回
IGrouping
,但它的作用是让结果集成为
IEnumerable
,而不是你的问题所暗示的“嵌套选择”。但是
select
实际上没有任何作用。关闭它将得到相同的结果,因为
IGrouping
IEnumerable
@NetMage Yes,
IGrouping
IEnumerable
,因为它实现了
IEnumerable
。那你到底想完成什么?如果像你最初问的那样拥有一个
IEnumerable
不能让你满意吗?我在回答中添加了一个测试。什么是
I分组
?我只知道
I分组
,它已经是
IEnumerable
。由于
IEnumerable
是协变的,因此
IEnumerable
已经自动成为
IEnumerable
您在这里问什么?您的测试与您的问题不匹配。。。在
IEnumerable ans2=Enumerable.Repeat中(new List(),1)
ans2属于
IEnumerable
类型,但您的测试将返回
anst
=false。这是因为
t==typeof(Enumerable)
将返回true的唯一类型是
Enumerable
(不是接口,而是实际的类Enumerable)。这几乎肯定不是您想要的。这可能是A/B问题吗?你想做什么,你觉得你需要做这个转换?正如其他人所说,您已经有了实现
IEnumerable
的东西。您是否真的遇到了一个不同的问题,您认为以上就是解决方案?您有一个非常奇怪的需求,所以我不会在我的答案中给出这个,但是看看参考源,如果您可以修改对GroupBy的调用,这将通过您的测试:src.GroupBy(s=>s.Field),(key,items)=>items.Skip(0));如果您想将GroupEnumerable转换为Enumerable,那么您已经有了最灵活的方法。不需要再找别的地方了。除非您对该嵌套选择有问题。