2010-04-13 20 views
10

Quando si utilizza il metodo di estensione .ToList() su un Stack<T>, il risultato è lo stesso di scoppiare ogni elemento e aggiungerlo a un nuovo elenco (al contrario di ciò che è stato premuto)?stack.ToList() in .NET - ordine degli elementi?

Se è così, è perché sta davvero iterando su ogni elemento, o memorizza gli elementi al contrario internamente e fa scorrere l'array in un nuovo List<T>?

risposta

9

Stack non dispone di un metodo ToList, è il metodo di estensione dalla classe Enumerable. Poiché questi metodi di estensione si occupano solo di IEnumerable, è ragionevole presumere che lo ToList iterazioni sugli elementi dello stack per creare il nuovo elenco.

Aggiornamento: ho controllato con Reflector; Stack<T> memorizza i suoi elementi in una matrice con l'elemento più in basso all'indice 0, ma il suo Enumerator itera l'array nell'ordine inverso. Quindi il primo elemento che esce dall'iteratore è il primo della pila.

+2

Perché è sicuro assumerlo? Non sono stato in grado di trovare nulla nella documentazione che indica in quale ordine l'Enumeratore per 'Stack ' itera, ma forse non ho avuto un bell'aspetto ... –

+0

Non lo dice a titolo definitivo (almeno non al momento), ma l'esempio con [la documentazione per 'Stack.GetEnumerator'] (https://msdn.microsoft.com/en-us/library/yfw8w9at%28v=vs.100%29.aspx?f= 255 e MSPPError = -2147217396) mostra un ordine last-to-first, e le operazioni di inversione dello stack nell'esempio non funzionerebbero se questo ordine non fosse usato (oops, come Jon Skeet ha detto nella sua risposta). – dlf

5

ToList itererà nello stesso ordine, come se avete fatto queste cose:

foreach (T item in stack) 

Il docs for GetEnumerator() non indicare esplicitamente l'ordine, per quanto posso dire, ma l'esempio mostra che sarà come se iterare stava scoppiando. Quindi se premi 1, 2, 3, 4, 5, allora ToList ti darà 5, 4, 3, 2, 1.

Problemi correlati