Also haben wir oft eine Funktion, die IEnumerable oder ICollection als Parameter akzeptiert. In Fällen, in denen wir einzelne Elemente haben, aber keine Sammlung, um sie zu speichern, müssen wir eine Sammlung erstellen, bevor Sie sie an die Funktion übergeben, wie:
%Vor%Ich habe immer ein Array oder eine Liste erstellt, wie ich es im letzten Beispiel gemacht habe. Aber ich frage mich, gibt es eine elegantere Möglichkeit, die erforderliche IEnumerable oder ICollection zu erstellen?
Es wäre ziemlich cool, wenn man das tun könnte:
%Vor%Und der Compiler würde die abstrakteste mögliche Sammlung erstellen, die die Anforderungen von IEnumerable oder ICollection erfüllen würde (abhängig davon, welche Funktion die Funktion akzeptiert).
Wie würden Sie o1, o2 und o3 trotzdem an IEnumerable- oder ICollection-Parameter übergeben?
Die aktuelle Version von C # (3) unterstützt eine Notation ohne expliziten Typ, d. h.
%Vor% um ein Array zu erstellen. Es gibt auch Linqs Enumerable.Range
, um einen kontinuierlichen Zahlenbereich zu erstellen. Alles andere muss umgesetzt werden. Im Geiste von Java:
soll so heißen:
%Vor%Das Erstellen eines Arrays und das Übergeben ist wahrscheinlich der einfachste / eleganteste Weg, dies in der aktuellen Version von C # zu erreichen. Sie können die implizite Array-Typisierung nutzen (d. H.% Co_de%, aber das ist so weit wie möglich.
Ich vermute, dass Sie wirklich nach dem C # -Aquivalent dieser F # -Syntax suchen:
%Vor% erzeugt ein new[] { ... }
, das über die angegebenen Elemente iteriert. ('Seq' ist eigentlich der F # Alias für 'IEnumerable', obwohl F # integrierte Unterstützung für sie hat.)
Leider, da dies ein weitgehend funktionaler Begriff ist, gibt es kein C # -Äquivalent - aber wer weiß, wann es hinzugefügt wird, da C # immer mehr funktioniert.
Wenn Sie eine Methode verwenden, die ein Array als letzten Parameter verwendet, kann es sinnvoll sein, diesen Parameter params
zu markieren. So können Sie die Methode wie folgt aufrufen:
Das finde ich besonders hilfreich, wenn ich einen Komponententest für Foo()
schreibe, weil meine Parameter in einem Unit-Test oft getrennt sind und nicht in einem Array.
Ich rate davon ab, wenn es eine Überladung von Foo()
gibt, die ein Array an dieser Position nicht benötigt, weil es schnell verwirrend werden kann.
Ich wünsche mir, dass die Sprache C # params
für IList<T>
:
Tags und Links .net c# ienumerable function-parameter icollection