2009-06-07 41 views

Odpowiedz

26

Jak już zasugerowano, należy użyć yourEnumerable.ToList(). Wylicza on poprzez swój IEnumerable, przechowując zawartość w nowym List. Niekoniecznie kopiujesz istniejącą listę, ponieważ Twój IEnumerable może leniwie generować elementy.

Jest to dokładnie to, co sugerują inne odpowiedzi, ale wyraźniejsze. Oto demontaż więc możesz być pewien:

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) 
{ 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    return new List<TSource>(source); 
} 
+0

spowoduje błąd, jeśli IEnumerable nie jest puste, ale puste? –

24

Użyj metody .ToList().

yourEnumerable.ToList(); 
+1

Jeśli nie są dostępne przy użyciu System.Linq brakuje :). To powinno być całkowicie akceptowaną odpowiedzią ... – CodingYourLife

0

nie, należy skopiować, jeśli jesteś pewien, że odwołanie jest odniesienie do wykazu, można konwertować jak ten

List<int> intsList = enumIntList as List<int>; 
+5

Jeśli jesteś * pewien *, że jest to odnośnik do listy, powinieneś użyć bezpośredniego rzutowania, aby rzucił wyjątek, jeśli się mylisz. Użyj "as", jeśli uważasz, że * może * być listą , ale nie jesteś pewien, a także nie są warunki błędu. Następnie sprawdź, czy wynik jest zerowy. –

+0

Może dodać 'if (intsList == null) intsList = new List (enumIntList);' jeśli * może * być "Listą " już, ale są pewne przypadki, w których tak nie jest. – jerryjvl

1

utworzyć nową listę i przekazać stary IEnumerable do jej inicjatora:

IEnumerable<int> enumerable = GetIEnumerable<T>(); 
    List<int> list = new List<int>(enumerable); 
+0

to także kopia listy. –

+0

będzie i tak potrzebna kopia. – Shimmy

3

Jak inni sugerują, wystarczy użyć metody ToList() na przeliczalnego obiektu:

var myList = myEnumerable.ToList() 

Ale jeśli obiekt IEnumerable nie ma sposobu ToList() a ty się błąd jak poniżej:

„IEnumerable” nie zawiera definicji „ToList”

pewnie brakuje nazw System.Linq, więc wystarczy dodać go:

using System.Linq 
Powiązane problemy