Ich lerne LINQ mit den 101 LINQ-Beispielen auf der MSDN-Seite und Ich bin auf diesen Code gestoßen:
%Vor%Der Zweck dieser Funktion besteht darin, "TakeWhile zu verwenden, um Elemente zurückzugeben, die am Anfang des Arrays beginnen, bis eine Nummer getroffen wird, die kleiner ist als ihre Position im Array."
Wie genau wissen n
und index
, welcher Parameter zu wählen ist? (d. h. wie weiß n
, dass es 5, 4, 1, 3, 9, 8, 6, 7, 2, 0
braucht und wie index
weiß, dass es ein Inkrement von 0, 1, 2, 3 ... macht)?
Weil die Überladung auf diese Weise definiert ist. Von MSDN
%Vor% Das Argument predicate
wird wie folgt beschrieben:
Eine Funktion, um jedes Quellelement auf eine Bedingung hin zu testen; der Zweite Parameter der Funktion repräsentiert den Index des Quellelements.
Das Argument TSource
ist das Element und das int
ist der Index. Der bool
ist der Rückgabewert.
Wenn Sie (n, index) => ...
schreiben, nimmt n
den ersten Parameter ( TSource
) und index
den zweiten ( int
).
In einem Lambda-Ausdruck ist alles vor =>
Parameter der Methode. Als Beispiel kann der (n, index) => n >= index
Lambda-Ausdruck als eine ähnliche Methode umgeschrieben werden:
Mit dieser Methode können Sie also den gewünschten Namen für die Parameter angeben (in diesem Fall habe ich value
anstelle von n
verwendet). Und anstelle des Lambda könnten Sie diese Methode hier verwenden:
Der erste Parameter n
ist mit der Nummer in Zahlen verknüpft und der zweite Parameter index
ist mit dem Index der Zahl in der Sequenz verknüpft. Eigentlich ist es egal, ob Sie ihnen n
und index
nennen, Sie könnten was auch immer nennen. In jedem Fall wäre der erste Parameter dem Zufallselement in der Sequenz und der zweite Parameter dem Index dieser Sequenz zugeordnet.
Wie formaler gesagt Bradley oben die Definition von TakeWhile
ist das folgende:
Wie wir oben sehen, ist TakeWhile
eine Erweiterungsmethode, die für Typen definiert ist, die die Schnittstelle IEnumerable
implementiert. Beachten Sie jetzt zwei Dinge, die Parameter, die diese Methode als Eingabe nehmen und den Rückgabetyp.
Gibt eine Sequenz von Objekten des Typs der Objekte zurück, die in der angegebenen Sequenz enthalten sind.
Was braucht es als Parameter?
Ein Prädikat. Ein Prädikat ist eine Methode, die einige Parameter akzeptiert und entweder true
oder false
zurückgibt. Was sind die Parameter des Prädikats?
Die Parameter des Prädikats sind ein TSource
-Element und ein int
. Das Element TSource
wäre das zufällige Element Ihrer Sequenz,% int
wäre der Index dieses Elements.
Was ist das (n, index) => n >= index
jetzt?
Dies ist ein Lambda-Ausdruck, der wie ein Prädikat wirkt.
Spezifisch, wenn man die Variablen n
und index
angibt, gibt true
wenn n>=index
zurück, sonst gibt false.
Die Angabe dieses Ausdrucks für die TakeWhile
Erweiterungsmethode ist wie die Übergabe eines Func<TSource, int, bool>
Prädikats . So bekommst du, was du willst.
Die beste Methode wäre es, Ihre eigene vereinfachte Methode TakeWhile
zu implementieren:
Sie würden ein yield return
im wirklichen Leben verwenden und ein IEnumerable
zurückgeben und natürlich Generics anstelle von int
verwenden. Aber die Idee ist die gleiche.
Wenn Sie es testen möchten:
%Vor% Es sollte {5, 4}
geben, was genau dem ursprünglichen TakeWhile
entspricht.