Konvertierung von IEnumerableT in IList

8

Wenn eine Methode einen Parameter vom Typ System.Collections.IList verwendet, kann ich einen Wert vom Typ System.Collections.Generic.IEnumerable<T> legitim / sicher übergeben?

Ich würde mich über eine gründliche Erklärung freuen, warum dies möglich ist und was tatsächlich mit dem Objekt T passiert, wenn das IEnumerable<T> innerhalb der Methode verwendet wird.

Wird es in den Basistyp von Object konvertiert?

Wird es als System.Collections.IEnumerable verwendet?

Gibt es Szenarien, in denen dies zu Problemen führt (z. B. zu Leistungsproblemen)?

Vielen Dank im Voraus, John

    
John Maloney 04.01.2010, 16:07
quelle

5 Antworten

26

Nein , Sie können eine IEnumerable<T> nicht an eine Methode übergeben, die IList benötigt. Die Schnittstelle IEnumerable<T> ist nicht in IList konvertierbar und der Versuch, eine Variable vom Typ IEnumerable<T> an eine Methode zu übergeben, die IList übernimmt, führt zu einem Kompilierungsfehler.

Damit dies funktioniert, müssen Sie einen der folgenden Schritte ausführen:

  1. Anstatt eine IEnumerable<T> zu haben, pflegen Sie einen Verweis auf einen Typ, der sowohl IEnumerable<T> als auch IList implementiert. List<T> ist ein guter Kandidat hier
  2. Konvertieren Sie die IEnumerable<T> -Instanz in ein neues Objekt, das in IList konvertierbar ist. In 3.5+ können Sie beispielsweise die Erweiterungsmethode .ToList() aufrufen, um eine neue List<T> über die Aufzählung zu erstellen.
JaredPar 04.01.2010, 16:14
quelle
4

Sie müssen ToList() aufrufen. Ссылка

    
Daniel A. White 04.01.2010 16:09
quelle
2

Nein. Sie können das nicht, ohne die Erweiterungsmethode ToList() zu verwenden. Ich denke, das sollte nicht zu dem großen Leistungsproblem führen - wenn Sie eine Alternative haben, sollten Sie sie zeitlich abgleichen und vergleichen.

Sie könnten auch new List<T>(myIEnumerable) verwenden - die Dokumentation besagt, dass diese Funktion ein% ist. co_de% Operation, aber ich kann nichts anderes über O(n) finden. Beachten Sie auch, dass ToList() auch List<T> sowie IList implementiert.

    
Lucas Jones 04.01.2010 16:08
quelle
1

IEnumerable erlaubt keinen indizierten Zugriff auf die Sammlung, während IList dies tut. Daher ist IList mehr als IEnumerable, und Sie werden damit nicht durchkommen. Natürlich implementieren einige Klassen beide Schnittstellen (zum Beispiel List & lt; & gt;) und diese funktionieren gut.

Wenn Sie von IEnumerable zu IList wechseln müssen, können Sie zuerst eine Besetzung versuchen, wenn Sie Glück haben, wird es funktionieren. Wenn nicht, müssen Sie die IEnumerable-Sammlung überwachen und eine neue IList erstellen.

Bearbeiten: Verwenden Sie ToList (), anstatt sich selbst zu provozieren, wie andere vorgeschlagen haben.

    
David Rutten 04.01.2010 16:09
quelle
0

Nein, Sie können es nicht IEnumerable übergeben. IList implementiert IEnumerable. Wenn Sie also Ihrer Methode eine IList übergeben, können Sie sie sicher als IEnumerable verwenden. VS wird das folgende nicht kompilieren:

%Vor%

Fehler zurückgegeben:

%Vor%     
Yuriy Faktorovich 04.01.2010 16:10
quelle

Tags und Links