Ein ObservableCollection<T>
ist ein Collection<T>
die implementiert IEnumerable<T>
. Deshalb ist die Tatsache, dass Ihr FooCollection
ist eine beobachtbare Sammlung nicht wichtig ist, können Sie es als eine Folge von Foo
betrachten, ein IEnumerable<Foo>
und ebenso ein IEnumerable<FooInFoo>
Ihr Code wird wie (sorry, ich weiß nur, wie in Methode schreiben Format) In kleinen Schritten:
IEnumerable<Foo> AllFooWithNumber1 = FooCollection
.Where(foo => foo.Number == 1);
Wenn Sie sicher sind, gibt es genau eine weiter mit:
Foo fooWithNumber1 = AllFooWithNumber1.Single();
Betrachten 012 mitWenn Sie nicht sicher sind, dass es einen gibt.
Sobald Sie den Foo, die Sie möchten, können Sie die Details wählen:
IEnumerable<FooInFoo> detailsOfFooWithNumber1 = fooWithNumber1.Details;
FooInFoo detailIWant = detailsOfFooWithNumber1
.Where(detail => some expression that uses detail...)
.SingleOrDefault();
string thisValueIWant = defailtIWant.thisValueIWant;
Oder in einer Erklärung:
string thisValueIWant = FooCollection
.Where(foo => foo.Number == 1)
.Single()
.Details
.Where(detail => ...)
.Single()
.thisValueIWant;
Probleme können auftreten, wenn Sie nicht sicher sind, gibt es eine Einzel Element.
Wenn Sie foo.Number für einen gegebenen Wert AND alle Details für einige Prädikat überprüfen möchten, verwenden Sie Enumerable.SelectMany. Dies wird immer dann verwendet, wenn Sie Folgen von Sequenzen haben (Arrays innerhalb von Arrays). Mit Select Sie all diese inneren Arrays aufzuzählen über, als ob es ein Array war:
IEnumerable<string> valuesIWant = FooCollection
.Where(foo => foo.Number == 1)
.SelectMany(foo => foo.Details)
// now you have one sequence of all FooInFoo that are Details within
// Foo objects with Number 1
.Where(detail => expression that selects the FooInFoo you want)
.Select(detail => detail.thisValueIWant);
Ihre Antwort ist logisch, aber ich habe einen Fehler, dass „Details“ ist kein Mitglied von „FooCollection“ Dieser funktioniert für mich jetzt: 'string x = (von f in FooCollection wo f.number == 1 wählen f.Details [0] .thisValueIwant) .FirstOrDefault();' Danke für Ihre Antwort – X89i
Ja, tut mir leid. Verpasst das. Aktualisiert. –