AddRange / concat Funktionalität in einem Lambda-Select-Ausdruck
Frage
class Foo
{
int PrimaryItem;
bool HasOtherItems;
IEnumerable<int> OtherItems;
}
List<Foo> fooList;
Wie bekomme ich eine Liste aller Artikel-IDs innerhalb fooList
verwiesen?
var items = fooList
.Select(
/*
f => f.PrimaryItem;
if (f.HasOtherItems)
AddRange(f => f.OtherItems)
*/
).Distinct();
Lösung
Mit SelectMany
und habe es eine verkettete Liste der PrimaryItem
und OtherItems
zurückzukehren (falls vorhanden):
var result = fooList
.SelectMany(f => (new[] { f.PrimaryItem })
.Concat(f.HasOtherItems ? f.OtherItems : new int[] { }))
.Distinct();
Andere Tipps
Als leichte Variation:
var items = fooList.Select(i => i.PrimaryItem).Union(
fooList.Where(foo => foo.HasOtherItems).SelectMany(foo => foo.OtherItems));
Dies ist der Satz von PrimaryItem
und (wo HasOtherItems
gesetzt) ??verkettet die kombinierte Gruppe von OtherItems
. Die Union
sorgt für deutlich.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow