【问题标题】:How do I Aggregate multiple IEnumerables of T如何聚合 T 的多个 IEnumerables
【发布时间】:2009-06-30 11:47:38
【问题描述】:

鉴于....

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。

【问题讨论】:

    标签: .net vb.net linq ienumerable


    【解决方案1】:

    您在寻找 SelectMany() 吗?

    MasterList.SelectMany(master => master.SubItems)
    

    对不起C#,不懂VB。

    【讨论】:

    • 太棒了...绝对喜欢 StackOverflow...您和 Oliver Hanappi 之间的密切合作...仅因代码更清晰而获得积分(差距非常小)。
    • 谢谢。当您在提出问题的前 5 分钟内与 100 名其他人竞争时,在这个网站上建立代表有点困难。 :-D
    • FWIW VB.Net 版本是“MasterList.SelectMany(function(master) master.SubItems)”
    • 如果有人想查看 C# 中的完整示例,我在找到这个问题之前发布了这个问题。问题编号是 1222846。我不知道如何从这里链接到它。
    【解决方案2】:

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

    C#代码

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


    最好的问候

    【讨论】:

    • 还要感谢奥利弗。很遗憾我不能分分......不过还是支持你。 :)
    • 没问题^^ 至少我现在可以离开cmets :)
    【解决方案3】:

    Enumerable.SelectManyIEnumerable monad 的关键,正如它的 Haskell 等价物 concatMap 是 Haskell 的 list monad 的关键。

    事实证明,您的问题直指计算机科学深层的核心。

    您需要注意措辞,因为Aggregate 的含义与SelectMany 完全不同——甚至相反。 AggregateIEnumerable 的值组合成单个值(可能是另一种类型),而 SelectMany unIEnumerable 的值组合成更多的值(可能是另一种类型) .

    【讨论】:

    • +1 表示背景,尽管在某种程度上 Aggregate 和 SelectMany 是相似的,因为它们根据输入列表的长度执行函数多次,并返回单个对象(其中恰好是 SelectMany 的另一个列表,但 Aggregate 也可以返回一个列表)。 Aggregate 的真正对立面通常称为 Unfold,而 BCL 中还没有此功能。
    • 没错,折叠和展开是相反的,但我的意思是与“相反”这个词略有不同 - 即,聚合需要许多并组合成一个,而 SelectMany 需要每个并分解成多个。此外,我不同意 SelectMany 返回单个对象 - 虽然在某种意义上是正确的,但在 IEnumerable monad 的意义上它不是正确的,您有列表去列表去列表(就像 Select、Where、Take、 Drop、OrderBy、GroupBy、SelectMany 等)。
    • @Justice.. 我对你在这里所说的很感兴趣...确实,起初我被 Aggregate 所吸引,因为从纯英语的角度来看,它似乎这就是我所需要的。我现在很好奇 Aggregate 提供了什么......也许你可以指向一个提供更多细节的链接......我很想看一个例子。再次感谢...非常有用。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 很想......不幸的是...... VB.Net 2008 :(它的少数失败之一是缺乏这样的运营商。
      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2014-08-30
      • 1970-01-01
      相关资源
      最近更新 更多