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,那么您已经有了最灵活的方法。不需要再找别的地方了。除非您对该嵌套选择有问题。