2010-12-21 10 views

Antwort

8

So gibt es hier viel los ist, aber fangen wir mit der Innenseite beginnen:

Func<TEntity, bool> ist ein Delegierter, der eine Eingabe nimmt, welche Art generisch ist, so dass wir es nur TEntity nennen. Ohne irgendwelche Einschränkungen kann dies alles sein, aber ein stark typisiertes Etwas.

Eine Ebene ist Expression<Func<TEntity, bool>>. Dies ist der Ausdrucksbaum, der stark typisiert ist, um ein Delegat zu sein, der eine Eingabe nimmt und ein bool zurückgibt. Mit anderen Worten, es ist ein Ausdrucksbaum (denken Sie zurück an Ihren Compiler-Kurs), der die Funktion darstellt. Die äußerste Ebene: TEntity Single(Expression<Func<TEntity, bool>> predicate) ist eine Methode namens Single, die eine Prädikatfunktion in Form eines Ausdrucks annimmt. Was zurückgegeben wird, ist derselbe Typ, der an diese Funktion übergeben wird.

Im Wesentlichen wird Single Ihren Ausdruck übernehmen, kompilieren und für eine Datengruppe ausführen, wobei die erste Entität in der Auflistung zurückgegeben wird, die mit dem Prädikatausdruck übereinstimmt.

Hoffe das hilft?

+0

Ihre Antwort erklärt es so viel besser als meine, jetzt gelöschte, tat. Ich war selbst verwirrt, als ich versuchte, meinen zu lesen! hehe –

+0

Eine kleine Klarstellung ist, dass Single eine Ausnahme auslöst, wenn es im Gegensatz zu First mehr als ein Ergebnis findet. – MerickOWA

0

Dies ist eine expression, die verwendet wird, um eine beliebige Delegatfunktion anzugeben, die eine "TEntity" (wie in dieser Instanz von der Sammlung definiert, an der sie aufgerufen wird) angibt und ein Bool zurückgibt. In der Praxis wird der Delegierte mit einer Lambda-Funktion angegeben:

items.Single(i => i.Id == 1); 

In Ihrem Beispiel die Einzelfunktion ist eine Erweiterung Methode, die auf eine generische Sammlung von TEntity angewendet wird (was ich haben noch keine Einschränkungen glauben - dh müssen nur Objekte sein). Daher wird der Typ von TEntity basierend auf der Sammlung abgeleitet, die Sie aufrufen.

+1

Nur eine kleine Nisse auswählen; Es ist überhaupt kein Lambda-Ausdruck. Es ist ein "Delegate" -Typ, der fast immer als Lambda übergeben wird. –