2010-04-13 10 views
10

Podczas korzystania z metody rozszerzania .ToList() na Stack<T>, wynik jest taki sam jak pojawienie się każdego elementu i dodanie do nowej listy (odwrotnie do tego, co zostało pchnięte)?stack.ToList() w .NET - kolejność elementów?

Jeśli tak, to czy tak naprawdę jest to iteracja nad każdym elementem, czy też wewnętrznie przechowuje elementy w odwrotnej kolejności i wsuwa tablicę do nowego List<T>?

Odpowiedz

9

Stack sama nie ma metody ToList, jest to metoda rozszerzenia z klasy Enumerable. Ponieważ te metody rozszerzenia dotyczą tylko IEnumerable, można bezpiecznie założyć, że ToList iteruje nad elementami stosu, aby utworzyć nową listę.

Zaktualizowano: Sprawdziłem za pomocą Reflektora; Stack<T> przechowuje swoje pozycje w tablicy z najniższym elementem w indeksie 0, ale jego Enumerator iteruje tablicę w odwrotnej kolejności. Dlatego pierwszym elementem, który wychodzi z iteratora, jest wierzchołek stosu.

+2

Dlaczego można to bezpiecznie założyć? Nie udało mi się znaleźć niczego w dokumentacji, która stwierdza, w której kolejności Enumerator dla 'Stack ' iteruje, ale może nie wyglądam wystarczająco dobrze ... –

+0

Nie mówi tego wprost (przynajmniej nie w tej chwili), ale przykład z [dokumentacją dla 'Stack.GetEnumerator'] (https://msdn.microsoft.com/en-us/library/yfw8w9at%28v=vs.100%29.aspx?f= 255 i MSPPError = -2147217396) pokazuje ostatnią kolejność, a operacje odwrócenia stosu w tym przykładzie nie działałyby, gdyby ta kolejność nie była używana (oops, jak powiedział Jon Skeet w swojej odpowiedzi). – dlf

5

ToList będzie iteracyjne w tej samej kolejności, jeśli to zrobił:

foreach (T item in stack) 

docs for GetEnumerator() nie jednoznacznie stwierdzić kolejność miarę mogę powiedzieć, ale ten przykład pokazuje, że będzie iteracyjne jakby to strzelało. Więc jeśli wciśniesz 1, 2, 3, 4, 5, to ToList da ci 5, 4, 3, 2, 1.

Powiązane problemy