Lass es uns in verschiedene Bits aufteilen:
%Vor% Das bedeutet, dass wir eine Methode deklarieren, die eine Liste von Label
Referenzen zurückgibt. Wir nehmen ein Array von String-Referenzen als Parameter und es wird als ein Parameter-Array deklariert, was bedeutet, dass Anrufer einfach die Argumente wie folgt angeben können:
(Oder sie können ein Array von Strings wie üblich explizit übergeben.)
Um nun den Körper zu verstehen, werden wir es so aufteilen:
%Vor% Die zweite und dritte Zeile sollten ziemlich einfach sein - es wird nur ein List<Label>
aus einer Sequenz von Labels konstruiert und dann zurückgegeben. Die erste Zeile ist wahrscheinlich diejenige, die Probleme verursacht.
Select
ist eine Erweiterungsmethode für den generischen Typ IEnumerable<T>
(eine Folge von Elementen vom Typ T
), die eine neue Sequenz durch Ausführen einer Projektion in Form eines Delegierten.
In diesem Fall wird der Delegat mit einem lambda -Ausdruck wie folgt angegeben:
%Vor% Das heißt: "Gegeben x
, erstellen Sie Label
und setzen Sie seine ID-Eigenschaft auf 0 und seine Name
-Eigenschaft auf x
." Hier wird der Typ von x
als string
angenommen, weil wir Select
in einem String-Array aufrufen. Dies verwendet nicht nur einen Lambda-Ausdruck, sondern auch einen Objektinitialisierer-Ausdruck . Der new Label { ID = 0, Name = x }
-Teil entspricht:
Wir könnten eine separate Methode dafür geschrieben haben:
%Vor%und dann angerufen:
%Vor%Das ist effektiv, was der Compiler hinter den Kulissen für Sie tut.
Die Projektion erzeugt also eine Sequenz von Etiketten mit den Namen, die der Parameter angibt. Der Code erstellt dann eine Liste von Labels aus dieser Sequenz und gibt sie zurück.
Beachten Sie, dass es (IMO) mehr idiomatische LINQ wäre geschrieben zu haben:
%Vor% statt explizit , um List<Label>
zu erstellen.
Im Allgemeinen kann die Bedeutung hinter gut geschriebenem Code oft durch den Code selbst abgeleitet werden. Dies wird als "selbstdokumentierender Code" bezeichnet. Code, der diesem nicht folgt, sollte hoffentlich von Kommentaren begleitet werden.
In diesem Fall können Sie herausfinden, wie der Code funktioniert:
Die Methode gibt Ihnen einige wichtige Informationen:
Der Name der Methode. Dadurch wissen Sie, was die Methode macht. In diesem Beispiel heißt die Methode CreateLabels
Die Signatur der Methode. Dies zeigt an, was die Methode erfordert. In diesem Beispiel gibt es ein Array vom Typ string mit dem Schlüsselwort params
. Das Schlüsselwort params
gibt an, dass diese Methode einen oder mehrere Namen als Eingaben für die Methode akzeptiert und sie in einem einzigen Array sammelt.
Der Rückgabetyp der Methode. Dies wird Ihnen sagen, wollen Sie die Methode wird Ihnen geben, wenn es fertig ist. In diesem Beispiel wird eine Liste von Labels zurückgegeben.
Also, da die Methode CreateLabels
heißt, eine Reihe von Namen genannten Strings nimmt und eine Liste von lables zurückgibt, könnten wir sagen, dass "Bei mehreren Namen gibt diese Methode eine Liste von lables zurück"
Wenn Sie jetzt wissen wollen, wie die Methode das macht, dann schauen Sie sich den Körper an.
return new List<Label>(names.Select(x => new Label { ID = 0, Name = x }));
Für jemanden, der linq oder lambda Ausdrücke nicht versteht, ist das ein bisschen schwierig zu verstehen.
Lasst uns unseren Weg von außen nach innen gehen:
return new List<Label>()
erstellt eine neue Liste, gibt die neue Liste zurück und bewirkt, dass die Methode beendet wird.
names.Select()
Eine Methode, die eine Reihe von Operationen auf alle Objekte im Array anwendet und eine neue Sammlung zurückgibt, die das Ergebnis der Anwendung dieser Operationen enthält.
x=>new Label {ID = 0, Name = x}
ist ein Lambda-Ausdruck, der besagt: x geht zu einem neuen Label-Objekt, dessen ID-Feld 0 ist, und Name ist der Wert von x
.
Wenn Sie alles zusammenfügen, erstellt die Anweisung return new List<Label>(names.Select(x => new Label { ID = 0, Name = x }));
für jeden Namen in names
ein neues Label-Objekt und speichert es in einer neuen Liste, die am Ende der Methode zurückgegeben wird.
Es ist ein Weg, auch zu schreiben:
%Vor%Dies nimmt einfach einen Namen variabler Größe und verwandelt sie in eine Liste von Etiketten mit der ID 0.
%Vor%Dies wird gedruckt:
eins
0
zwei
0
drei
0
Dieser Code gibt die Sammlung ( List
) von Label
-Klassen zurück. Foreach-String-Variable im Eingabeparameter names
Erzeugt eine neue Instanz der Klasse Label mit ID-Eigenschaft gleich 0 und Name-Eigenschaft gleich dem aktuellen names
-Element
Sie können diesen Code wie folgt ändern:
%Vor%Sie müssen dies linq 101-Beispiel lernen, dann kennen Sie sich selbst die Bedeutung dieses Codes .
Ok, hier geht es:
%Vor% Dies erstellt eine neue Instanz von Label
mit ID
auf 0 und Name
auf x
.
Dies wird als Lambda-Ausdruck bezeichnet - es definiert eine anonyme Funktion, die einen einzelnen akzeptiert input ( x
) und gibt eine neue Instanz von label zurück. Sie können es leichter finden, x => ...
als " x
goes to ..." zu lesen.
Dies ruft die Methode Select
für das Objekt names
auf und übergibt den obigen Lambda-Ausdruck als Parameter. Wir können sehen, dass der Typ von names
ein string
-Array ist. Dies ist in der Tat eine Erweiterungsmethode - string[]
definiert keine Methode Select
, Die Select-Methode ( hier auf MSDN) ist an anderer Stelle definiert (in der Assembly System.Core
)
Die Auswahlmethode "Projiziert einfach jedes Element einer Sequenz in ein neues Formular". - Im Wesentlichen wird jedes Element im Array in ein anderes Objekt konvertiert (in unserem Fall eine Instanz von Label
)
Zur Verdeutlichung: Die obige Anweisung liefert eine IEnumerable (eine Art von Sammlung) von Label
-Objekten, eins für jeden String in names
.
Dies gibt eine neue Liste von Label
-Objekten zurück - in unserem Fall geben wir unseren IEnumeable zurück, der durch den Aufruf von Select
zurückgegeben wurde.
Kurz gesagt:
Diese Methode gibt eine Liste von Label
-Objekten aus, eins für jeden String in names
. Für jedes Label
-Objekt ist ID
auf 0
und Name
auf den Zeichenfolgenwert aus dem names
-Array festgelegt.
Kann ich erklären, was hier vor sich geht?
Tags und Links c#