Given....
Public MasterList as IEnumerable(Of MasterItem)
Public Class MasterItem(Of T)
Public SubItems as IEnumerable(Of T)
End Class
I would like a single IEnumerable(Of T) which will iterate through all SubItems of all MasterItems in MasterList
I would like to think that there is a Linq facility to do this, or an extension method I am overlooking. I need a mechanism that works in VB9 (2008) and hence does not use Yield.
Are you looking for SelectMany()?
MasterList.SelectMany(master => master.SubItems)
Sorry for C#, don't know VB.
You can achieve this by Linq with SelectMany
C# Code
masterLists.SelectMany(l => l.SubItems);
Best Regards
Enumerable.SelectMany
is the key to the IEnumerable
monad, just as its Haskell equivalent, concatMap
, is the key to Haskell's list monad.
As it turns out, your question goes right to the heart of a deep aspect of computer science.
You will want to be careful with your phrasing, because Aggregate
means something very different from SelectMany
- even the opposite. Aggregate
combines an IEnumerable
of values into a single value (of possibly another type), while SelectMany
uncombines an IEnumerable
of values into even more values (of possibly another type).
Just to provide true VB.NET answers:
' 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)
These all compile down to the same IL, except children2
requires the equivalent of Function(master, child) child
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With