如何聚合T的多个IEnumebles

时间:2009-06-30 11:47:39

标签: .net vb.net linq ienumerable

...鉴于

Public MasterList as IEnumerable(Of MasterItem)
Public Class MasterItem(Of T) 
    Public SubItems as IEnumerable(Of T)
End Class 

我想要一个IEnumerable(Of T),它将遍历MasterList中所有MasterItems的所有SubItems

我想认为有一个Linq设施可以做到这一点,或者我正在忽略的扩展方法。我需要一种在VB9(2008)中运行的机制,因此不使用Yield。

5 个答案:

答案 0 :(得分:27)

您在寻找SelectMany()?

MasterList.SelectMany(master => master.SubItems)

对不起C#,不懂VB。

答案 1 :(得分:8)

你可以通过Linq和SelectMany来实现这个目标

C#代码

masterLists.SelectMany(l => l.SubItems);


最诚挚的问候

答案 2 :(得分:8)

Enumerable.SelectManyIEnumerable monad的关键,就像它的Haskell等价物concatMap一样,是Haskell列表monad的关键。

事实证明,你的问题正好涉及计算机科学深层次的核心。

你需要小心你的措辞,因为Aggregate意味着与SelectMany非常不同 - 甚至相反。 AggregateIEnumerable值组合成一个值(可能是另一种类型),而SelectMany un IEnumerable值组合成均值更多的值(可能是另一种类型)。

答案 3 :(得分:3)

只是提供真正的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)

这些都编译为相同的IL,除了children2需要相当于Function(master, child) child

答案 4 :(得分:1)

我知道在C#中有yield运算符for循环。只需递归迭代和yield return每个子项。显然,VB没有yield,抱歉。