.net 如何聚合T的多个IEnumerables

.net 如何聚合T的多个IEnumerables,.net,vb.net,linq,ienumerable,.net,Vb.net,Linq,Ienumerable,给定 Public MasterList as IEnumerable(Of MasterItem) Public Class MasterItem(Of T) Public SubItems as IEnumerable(Of T) End Class 我想要一个IEnumerablet,它将遍历主列表中所有主项的所有子项 我想有一个Linq设施来做这件事,或者是一个我忽略的扩展方法。我需要一个在VB9 2008中工作的机制,因此不使用收益率。我知道在C中有循环的收益率操作符。只

给定

Public MasterList as IEnumerable(Of MasterItem)
Public Class MasterItem(Of T) 
    Public SubItems as IEnumerable(Of T)
End Class 
我想要一个IEnumerablet,它将遍历主列表中所有主项的所有子项


我想有一个Linq设施来做这件事,或者是一个我忽略的扩展方法。我需要一个在VB9 2008中工作的机制,因此不使用收益率。

我知道在C中有循环的收益率操作符。只需迭代并递归返回每个子项。很显然,VB没有收益,对不起。

你在找SelectMany吗

MasterList.SelectMany(master => master.SubItems)

对不起,C,我不懂VB。

您可以通过Linq和SelectMany来实现这一点

C代码

masterLists.SelectMany(l => l.SubItems);
最好的问候

Enumerable.SelectMany是IEnumerable单子的键,正如它的Haskell等价物concatMap是Haskell列表单子的键一样

事实证明,你的问题直指计算机科学的一个深层次方面


你需要小心你的措辞,因为聚合的意思与SelectMany非常不同,甚至相反。聚合将一个IEnumerable值组合成一个可能是另一种类型的值,而SelectMany将一个IEnumerable值取消组合成更多可能是另一种类型的值。

仅提供真正的VB.NET答案:

' Identical to Per Erik Stendahl's and Oliver Hanappi's C# answers
Dim children1 = MasterList.SelectMany(Function(master) master.SubItems)

' Using VB.NET query syntax
Dim children2 = From master In MasterList, child in master.SubItems Select child

' Using Aggregate, as the question title referred to
Dim children3 = Aggregate master In MasterList Into SelectMany(master.SubItems)

除了children2需要与Functionmaster、child-child等效的函数外,所有这些函数都编译为相同的IL。

希望。。。。不幸地VB.NET2008:它的几个缺点之一就是缺少这样一个操作符。太棒了。。。绝对爱你。。。你和奥利弗·哈纳皮之间的亲密关系。。。。只因代码稍微清晰而获得的分数非常小。谢谢。当你在被问问题的前5分钟内与100名其他人竞争时,很难在这个网站上建立声誉-DFWIW VB.Net版本是MasterList.SelectManyfunctionmaster.SubItems如果有人想看C语言的完整示例,我在找到这个示例之前就发布了这个问题。问题号码是1222846。我不知道如何从这里链接到它。也谢谢你,奥利弗。遗憾的是我没能分到几点。。。不管怎样,我还是投票给了你没问题^^至少我现在可以留下评论:+1作为背景,尽管在某种程度上Aggregate和SelectMany是相似的,因为它们根据输入列表的长度多次执行一个函数,并返回一个对象,该对象恰好是SelectMany的另一个列表,但Aggregate也可以返回一个列表。聚合的真正对立面通常称为展开,BCL中还没有这方面的功能。没错,折叠和展开是相反的,但我的意思与“对立面”一词略有不同,即聚合取多并合并为一,而SelectMany取多并合并为多。此外,我不同意SelectMany返回单个对象——虽然在某种意义上是真的,但在IEnumerable monad的意义上却不是真的,在IEnumerable monad中,列表指向列表指向列表,就像Select、where、Take、Drop、OrderBy、GroupBy、SelectMany等。。我对你在这里说的话很感兴趣。。。的确,一开始我被吸引到聚合,因为从纯英语的角度来看,这似乎是我所需要的。我现在很好奇,总起来能提供什么。。。也许你可以给我指一个链接,提供更多细节。。。我希望看到一个例子。再次感谢。。。非常有用。