【发布时间】:2018-03-15 23:39:18
【问题描述】:
如果您有IEnumerable<IGrouping<K, T>>,请说来自
var ans = src.GroupBy(s => s.Field);
有没有更好的方法(很少使用 LINQ 方法/变体)转换为IEnumerable<IEnumerable<T>>,然后像这样嵌套Selects:
var ans2 = ans.Select(g => g.Select(s => s));
对于不理解的人,
var anst = ans2.Select(g => g.GetType().ReflectedType).All(t => t == typeof(Enumerable));
应该返回anst == true。
【问题讨论】:
-
IGrouping<T>是什么接口?我只知道IGrouping<K, T>,已经是IEnumerable<T>。由于IEnumerable<T>是协变的,IEnumerable<IGrouping<K, T>>已经自动成为IEnumerable<IEnumerable<T>>你到底在问什么? -
您的测试与您的问题不匹配...在
IEnumerable<IEnumerable> ans2 = Enumerable.Repeat(new List<int>(),1);ans2 的类型为IEnumerable<IEnumerable>,但您的测试将返回anst= false。这是因为t == typeof(Enumerable)将返回 true 的唯一类型是Enumerable(不是接口,实际类 Enumerable)。这几乎肯定不是你想要的。 -
这可能是 A/B 问题吗?你想做什么,你觉得你需要做这个转换?正如其他人所说,您已经有了实现
IEnumerable<IEnumerable>的东西。您实际上是否遇到了您认为以上是解决方案的不同问题? -
你有一个非常奇怪的要求,所以我不会把这个放在我的答案中,但是看看参考源,如果你可以修改你对 GroupBy 的调用,这将通过你的测试:src.GroupBy( s => s.Field), (key, items) => items.Skip(0));
-
如果您打算将 GroupEnumerable 转换为 Enumerable,那么您已经有了最巧妙的方法。无需再看其他地方。除非您对该嵌套选择有疑问。
标签: c# linq ienumerable igrouping