Was ist der einfachste und kompakteste Weg, um IEnumerableT oder ICollectionT zu erstellen?

8

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?

    
Ashley Simpson 26.09.2009, 14:58
quelle

5 Antworten

10

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:

%Vor%

soll so heißen:

%Vor%     
Konrad Rudolph 26.09.2009, 15:02
quelle
3

Manchmal habe ich eine Methode mit einem Argument "params" verwendet.

%Vor%

Und wenn ich tot auf IEnumerable gesetzt bin, habe ich nur diese Methode delegieren an die, die IEnumerable will.

%Vor%

Sie müssen AsEnumerable aufrufen oder rekrutieren.

    
Mike Two 26.09.2009 15:03
quelle
2

Wenn angenommen wird, dass Foo ein IEnumerable & lt; T & gt; erwartet, können Sie die Vorteile der Typinferenz ausnutzen und tun:

%Vor%     
goric 26.09.2009 15:01
quelle
2

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.

    
Noldorin 26.09.2009 15:03
quelle
0

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:

%Vor%

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> :

erlaubt %Vor%     
Jay Bazuzi 26.09.2009 15:18
quelle