2009-03-24 7 views

risposta

20

Dovrei essere in disaccordo con tutte le risposte finora.

Innanzitutto, lo standard C# 3.0 garantisce l'ordine di foreach su un array:

L'ordine in cui foreach attraversa gli elementi di una matrice, è segue: Per gli array monodimensionale elementi sono attraversati ascendente ordine di indice, partendo con indice 0 e termina con indice Lunghezza - 1. Per array multidimensionali, elementi attraversati tale che gli indici della dimensione destra sono aumentati primo, quindi la prossima dimensione a sinistra, e così via a sinistra.

- C# Language Specification Version 3.0, pagina 240.

In secondo luogo, sugli oggetti, foreach (C#) e per ogni (VB.NET) lavoro utilizzando il MoveNext, Reset, e attuali membri su un oggetto (source). Questi sono in genere parte dell'interfaccia IEnumerator.

Nelle raccolte che hanno un ordine (leggi: cose che implementano IList o IList (T)), ciò significa che gli elementi verranno restituiti nell'ordine in cui il backing store li memorizza.

+4

+1 poiché è corretto per tutti gli array e gli elenchi standard. Sebbene sia pedante, una classe personalizzata che implementa IList (T) può implementare il proprio enumeratore per restituire gli elementi nell'ordine che preferisce. – Joe

+0

Eccellente! Grazie. Ho appena vinto una scommessa contro un collega :) –

+1

Questo vale per l'array, ma non necessariamente per altre raccolte. –

5

Non ci sono garanzie. La maggior parte delle implementazioni di liste/array restituiscono i valori in ordine, ma esistono sicuramente delle eccezioni, in particolare in alcune delle classi di raccolta meno comuni. (Ad esempio, in C5, molte raccolte restituiscono valori in ordini molto diversi rispetto a quando sono stati enumerati.)

+4

Non sono d'accordo con i downvotes qui. Come ho detto, ci sono implementazioni di elenchi che non garantiscono l'ordine. L'array standard in C# e le classi dell'elenco BCL garantiscono l'ordine, ma la domanda originale non si limita solo a questi ... –

0

Nessuna garanzia di progettazione. foreach è concepito per l'enumerazione senza ordine e implica che il runtime possa persino elaborare più elementi in parallelo. Non dovresti mai fare affidamento su alcun ordine di enumerazione.

Problemi correlati