Как объединить несколько IEnumerables из T - PullRequest
18 голосов
/ 30 июня 2009

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

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 ]

27 голосов
/ 30 июня 2009

Вы ищете SelectMany ()?

MasterList.SelectMany(master => master.SubItems)

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

8 голосов
/ 01 июля 2009

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

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

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

8 голосов
/ 30 июня 2009

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

C # код

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


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

3 голосов
/ 05 февраля 2014

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

1 голос
/ 30 июня 2009

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

...