Die beste Methode zum Konvertieren eines IEnumerableT in ein T []

8

Was ist der beste Weg, um von einer generischen IEnumerable<T> Implementierung in ein Array von T zu konvertieren? Die aktuelle Lösung, die ich habe, sieht wie folgt aus:

%Vor%

Die Übertragung durch List<T> scheint unnötig, aber ich konnte keinen besseren Weg finden, es zu tun.

Hinweis: Ich arbeite hier in C # 2.0.

    
Scott Pedersen 31.01.2009, 01:18
quelle

4 Antworten

14

.NET 3.0 und nachher: ​​

Rufen Sie die ToArray Erweiterungsmethode für% co_de auf %, tut es fast das gleiche wie unten und führt Typ-Sniffing und einige andere Optimierungen durch.

.NET 2.0 und vorher:

Im Allgemeinen verwenden Sie eine IEnumerable<T> , die mit List<T> und dann IEnumerable<T> ist wahrscheinlich der einfachste Weg, dies zu tun.

Der Konstruktor für ToArray überprüft das List<T> , um zu sehen, ob es implementiert wird IEnumerable<T> , um die Anzahl der Elemente zu ermitteln, um die Kapazität der Liste ordnungsgemäß zu initialisieren. Wenn nicht, wird es wie gewohnt erweitert.

Natürlich könnten Sie am Ende eine Anzahl von ICollection<T> Instanzen erstellen, nur um List<T> in IEnumerable<T> zu transformieren. Zu diesem Zweck können Sie Ihre eigene Methode schreiben, aber Sie würden wirklich nur den Code kopieren, der bereits in T[] existiert.

    
casperOne 31.01.2009, 01:27
quelle
5

Bei einem kleinen .NET Reflector sieht es so aus, als ob die Linq ToArray-Erweiterungsmethode dasselbe tut, wie IEnumerable durch eine List & lt; & gt; Die Buffer-Klasse ist eine interne Klasse, aber das Verhalten scheint List & lt; & gt; ähnlich zu sein.

%Vor%     
Rob McCready 02.02.2009 12:24
quelle
0

Wenn es keine Möglichkeit gibt, die Länge des Arrays zu bestimmen, ist das der beste Weg.

Es gibt nichts in IEnumerable, mit dem Sie die Länge bestimmen können, aber vielleicht hat Ihr Code eine Möglichkeit, einen anderen Weg zu finden. Wenn ja, verwenden Sie das, um ein Array zu konstruieren.

    
Ray Hidayat 31.01.2009 01:25
quelle
0
%Vor%     
user1920925 04.11.2013 12:03
quelle