Wie werden Lambda-Parameter in TakeWhile abgebildet?

7

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)?

    
C.J. 31.10.2014, 20:02
quelle

4 Antworten

9

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 ).

    
BradleyDotNET 31.10.2014, 20:04
quelle
4

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:

%Vor%

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:

%Vor%     
Dave Zych 31.10.2014 20:08
quelle
3

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:

%Vor%

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.

    
Christos 31.10.2014 20:03
quelle
2

Die beste Methode wäre es, Ihre eigene vereinfachte Methode TakeWhile zu implementieren:

%Vor%

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.

    
mihai 31.10.2014 20:18
quelle

Tags und Links