2008-10-03 10 views

risposta

15

Risposta breve - sì.

Ovviamente, tuttavia, l'ordine degli elementi nella raccolta potrebbe non essere esattamente come sono stati inseriti, a seconda del tipo di raccolta (un dizionario, ad esempio).

Ma otterrete gli stessi risultati ogni volta che iterate su una singola raccolta non modificata utilizzando un ciclo foreach.

+0

hmmmm ... sembra che entrambi abbiamo fatto la stessa cosa. Ha scritto una frase, l'ha pubblicata e subito modificata per elaborare. –

+0

Infatti. Penso che la tua risposta sia più appropriata della mia, si spera che l'OP la tagga come definitiva. Sicuramente sembra che stia vincendo il voto popolare :) –

+0

Il problema con il tagging come risposta definitiva, ovviamente, è che non è accurato! –

25

Dipende dal tipo di raccolta. Per la maggior parte delle raccolte, la risposta è "Sì".

Tuttavia, questo non è garantito. I documenti di un tipo di raccolta dovrebbero specificare se lo fa o no, ma come la maggior parte, tale dettaglio è generalmente sovraesposto. Tuttavia, se non è stabile, sarebbe un enorme controllo se i documenti non lo menzionassero.

0

Direi che per la maggior parte della raccolta è sicuro assumerlo. Non è al di là dei regni di possibilità che una certa collezione possa avere l'enumeratore implementato in modo non deterministico, ma probabilmente non succederà ...

+0

Dipende se ti piace avere codice che "probabilmente" funzionerà. Personalmente mi piace essere più fiducioso di così! – MarkJ

6

Mentre la risposta è "sì" per tutte le collezioni incorporate e probabilmente qualsiasi classe di raccolta sana di mente, la documentazione non ha alcun vincolo formulato per IEnumerable. Pertanto, nulla ci dice che ogni iterazione deve essere stabile.

ho potuto immaginare il seguente caso d'uso:

foreach (int i in new Shuffler(1, 2, 3, 4, 5, 6, 7, 8, 9)) 
    Console.WriteLine(i); 

Questo può ben essere implementato come una classe che produce un ordinamento diverso per ogni iterazione.

Quindi, se si desidera considerare anche strani casi borderline, la risposta dovrebbe essere "no".

+0

Uh, James ha cambiato la sua risposta? Quando ho scritto il mio, era ancora originale. : -/ –

+0

eccellente esempio di un caso in cui l'ordine non sarebbe coerente! –

3

Mentre in genere, gli elementi verranno restituiti nello stesso ordine, non c'è assolutamente alcuna garanzia. Dipende interamente dall'implementazione interna della classe di raccolta.

posso vedere un caso per una classe di insieme che è specificamente progettato per restituire gli elementi in un ordine casuale, per esempio.

In breve, a meno che non si conosca l'implementazione interna della classe di raccolta, non considerare nulla sull'ordine.

10

Non si può garantire questo se non si conosce l'attuazione concreta della classe si sta iterare su.

Le raccolte che hanno un ordine di elementi definito (ad esempio List<T>) verranno enumerate in un ordine stabile.

Per le collezioni in cui lo stato dell'oggetto non cambia è altamente probabile che gli elementi tornerà nello stesso ordine, per esempio Dictionary<K,V>, anche se questo non è garantito dalle specifiche.

Come esempio di dove questo non sarebbe il caso, si potrebbe immaginare un'implementazione dizionario tabella hash basato che compatta o ridimensiona la tabella in modo asincrono.Tale implementazione non garantirebbe un ordine di iterazione stabile.

1

Re "non modificato" (risposta di NM) - si noti che molti contenitori complessi come il dizionario non garantiscono l'ordine. A volte l'aggiunta di un elemento lo farà apparire ultimo (dando l'impressione che l'ordine sia preservato), e a volte causerà la riorganizzazione dei bucket interni, dando un ordine completamente diverso.

Le cose come SortedList <,> etc ovviamente hanno le proprie regole.

Problemi correlati