Как объединить несколько IEnumerables из T

Дано....

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

Я хотел бы один IEnumerable (Of T), который будет перебирать все подэлементы всех MasterItems в MasterList

Я хотел бы думать, что есть средство Linq, чтобы сделать это, или метод расширения, который я пропускаю. Мне нужен механизм, который работает в VB9 (2008) и, следовательно, не использует доходность.

Ответы на вопрос(5)

Просто, чтобы предоставить истинные ответы 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.

Enumerable.SelectMany это ключ кIEnumerable монада, как и ее эквивалент Хаскелла,concatMap, является ключом к монаде списка Haskell.

Как выясняется, ваш вопрос направлен прямо в глубину глубокого аспекта информатики.

Вы хотите быть осторожным с вашей формулировкой, потому чтоAggregate означает что-то очень отличное отSelectMany - даже наоборот.Aggregate сочетает в себеIEnumerable значений в одно значение (возможно, другого типа), в то время какSelectMany unсочетает в себеIEnumerable значений в еще большее количество значений (возможно, другого типа).

Вы можете достичь этого с помощью Linq с SelectMany

Код C #

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


С уважением

Решение Вопроса

Вы ищете SelectMany ()?

MasterList.SelectMany(master => master.SubItems)

Извините за C #, не знаю VB.

Я знаю, в C # естьyield оператор для циклов. Просто повторяем иyield return каждый подпункт рекурсивно. Видимо, нетyield для VB, извините.

Ваш ответ на вопрос