2010-04-13 15 views
10

Al usar el método de extensión .ToList() en un Stack<T>, ¿el resultado es lo mismo que mostrar cada elemento y agregarlo a una nueva lista (al revés de lo que se presionó)?stack.ToList() en .NET - orden de los elementos?

Si es así, ¿esto se debe a que realmente se está iterando sobre cada elemento, o almacena los elementos en reversa internamente y desliza la matriz en un nuevo List<T>?

Respuesta

9

Stack En sí mismo no tiene un método ToList, es el método de extensión de la clase Enumerable. Como esos métodos de extensión solo se refieren a IEnumerable, es seguro suponer que ToList itera sobre los elementos de la pila para crear la nueva lista.

Actualizado: Lo revisé con Reflector; Stack<T> almacena sus elementos en una matriz con el elemento inferior en el índice 0, pero su Enumerator itera la matriz en orden inverso. Por lo tanto, el primer elemento que sale del iterador es la parte superior de la pila.

+2

¿Por qué es seguro suponer eso? No he podido encontrar nada en la documentación que indique en qué orden se repite el enumerador de 'Stack ', pero tal vez no me veo lo suficientemente bien ... –

+0

No lo dice rotundamente (al menos no por el momento), pero el ejemplo con [la documentación de 'Stack.GetEnumerator'] (https://msdn.microsoft.com/en-us/library/yfw8w9at%28v=vs.100%29.aspx?f= 255 & MSPPError = -2147217396) muestra un orden de último a primer, y las operaciones de inversión de pila en el ejemplo no funcionarían si no se usara este orden (oops, como dijo Jon Skeet en su respuesta). – dlf

5

ToList se repetirá en el mismo orden que si se hizo esto:

foreach (T item in stack) 

El docs for GetEnumerator() no declarar explícitamente el orden por lo que yo puedo decir, pero el ejemplo muestra que se va a repetir, como si estaba estallando. Entonces, si presiona 1, 2, 3, 4, 5, entonces ToList le dará 5, 4, 3, 2, 1.

Cuestiones relacionadas