Ответ 1
Вы ищете SelectMany()?
MasterList.SelectMany(master => master.SubItems)
Извините за С#, не знаю VB.
Учитывая....
Public MasterList as IEnumerable(Of MasterItem)
Public Class MasterItem(Of T)
Public SubItems as IEnumerable(Of T)
End Class
Мне нужен один IEnumerable (Of T), который будет перебирать все SubItems всех MasterItems в MasterList
Я хотел бы думать, что для этого есть средство Linq или метод расширения, который я пропускаю. Мне нужен механизм, который работает в VB9 (2008) и, следовательно, не использует Yield.
Вы ищете SelectMany()?
MasterList.SelectMany(master => master.SubItems)
Извините за С#, не знаю VB.
Вы можете добиться этого Linq с помощью SelectMany
Код С#
masterLists.SelectMany(l => l.SubItems);
С наилучшими пожеланиями
Enumerable.SelectMany
является ключом к монаде IEnumerable
, так же как его эквивалент Haskell, concatMap
, является ключом к монаде списка Haskell.
Как выясняется, ваш вопрос подходит к сердцу глубокого аспекта информатики.
Вам нужно быть осторожным с вашей фразой, потому что Aggregate
означает нечто очень отличное от SelectMany
- даже наоборот. Aggregate
объединяет IEnumerable
значений в одно значение (возможно, другого типа), а SelectMany
унифицирует значения IEnumerable
до еще большего значения (возможно, другого типа).
Просто для предоставления истинных ответов VB.NET:
' Identical to Per Erik Stendahl and Oliver Hanappi 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
.
Я знаю, что в С# существует оператор yield
для циклов. Просто перебирайте и yield return
каждый подрегумент рекурсивно. По-видимому, для VB нет yield
.