18

与えられた...

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

MasterList内のすべてのMasterItemのすべてのSubItemを反復処理する単一のIEnumerable(Of T)が必要です。

これを行うためのLinqファシリティ、または私が見落としている拡張方法があると思います。VB9(2008)で機能するため、Yieldを使用しないメカニズムが必要です。

4

5 に答える 5

27

SelectMany()をお探しですか?

MasterList.SelectMany(master => master.SubItems)

C#で申し訳ありませんが、VBはわかりません。

于 2009-06-30T11:50:58.613 に答える
8

これは、SelectManyを使用したLinqによって実現できます。

C#コード

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


よろしくお願いします

于 2009-06-30T11:51:16.367 に答える
8

Enumerable.SelectManyIEnumerableモナドの鍵であり、Haskellに相当するものと同じようにconcatMap、はHaskellのリストモナドの鍵です。

結局のところ、あなたの質問はコンピュータサイエンスの深い側面の核心に直接当てはまります。

言い回しには注意が必要です。というのは、それAggregateとはまったく異なることを意味するからSelectManyです。of値を(おそらく別のタイプの)単一の値にAggregate結合し、 unはof値をさらに多くの(おそらく別のタイプの)値に結合します。IEnumerableSelectMany IEnumerable

于 2009-07-01T13:05:08.677 に答える
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)

children2に相当するものが必要な場合を除いて、これらはすべて同じILにコンパイルされFunction(master, child) childます。

于 2014-02-05T01:44:16.277 に答える
1

C#にはyieldforループの演算子があることを私は知っています。繰り返すだけで、yield return各サブアイテムが再帰的になります。どうやら、yieldVBにはありません、ごめんなさい。

于 2009-06-30T11:50:01.767 に答える