...鉴于
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。
答案 0 :(得分:27)
您在寻找SelectMany()?
MasterList.SelectMany(master => master.SubItems)
对不起C#,不懂VB。
答案 1 :(得分:8)
你可以通过Linq和SelectMany来实现这个目标
C#代码
masterLists.SelectMany(l => l.SubItems);
最诚挚的问候
答案 2 :(得分:8)
Enumerable.SelectMany
是IEnumerable
monad的关键,就像它的Haskell等价物concatMap
一样,是Haskell列表monad的关键。
事实证明,你的问题正好涉及计算机科学深层次的核心。
你需要小心你的措辞,因为Aggregate
意味着与SelectMany
非常不同 - 甚至相反。 Aggregate
将IEnumerable
值组合成一个值(可能是另一种类型),而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
,抱歉。