Подтвердить что ты не робот

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

Учитывая....

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.

4b9b3361

Ответ 1

Вы ищете SelectMany()?

MasterList.SelectMany(master => master.SubItems)

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

Ответ 2

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

Код С#

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


С наилучшими пожеланиями

Ответ 3

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

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

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

Ответ 4

Просто для предоставления истинных ответов 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.

Ответ 5

Я знаю, что в С# существует оператор yield для циклов. Просто перебирайте и yield return каждый подрегумент рекурсивно. По-видимому, для VB нет yield.