Domanda

È sicuro presumere che due iterazioni sulla stessa raccolta restituiranno gli oggetti nello stesso ordine? Ovviamente, si presume che la raccolta non sia stata altrimenti modificata.

È stato utile?

Soluzione

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 otterrai gli stessi risultati ogni volta che esegui l'iterazione su una singola raccolta non modificata usando un ciclo foreach.

Altri suggerimenti

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

Tuttavia, questo non è garantito. I documenti di un tipo di raccolta dovrebbero specificare se lo fanno o meno, ma come molti altri, quel dettaglio è generalmente trascurato. Tuttavia, se non è stabile, sarebbe una tremenda svista se i documenti non lo menzionassero.

Non puoi garantirlo se non conosci l'implementazione concreta della classe su cui stai ripetendo.

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

Per le raccolte in cui lo stato dell'oggetto non cambia, è molto probabile che gli elementi tornino nello stesso ordine, ad es. Dictionary<K,V>, sebbene ciò non sia garantito dalle specifiche.

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

Mentre la risposta è & # 8220; sì & # 8221; per tutte le raccolte integrate e probabilmente per qualsiasi classe di raccolta sana là fuori, la documentazione non ha alcun vincolo formulato per IEnumerable. Pertanto, nulla ci dice che ogni iterazione deve essere stabile.

Potrei 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 potrebbe essere implementato come una classe che produce un ordine diverso per ogni iterazione.

So & # 8211; se vuoi anche considerare strani casi limite, la risposta dovrebbe essere & # 8220; no & # 8221 ;.

Sebbene in genere gli elementi vengano restituiti nello stesso ordine, non esiste alcuna garanzia. Dipende interamente dall'implementazione interna della classe di raccolta.

Riesco a vedere un caso per una classe di raccolta appositamente progettata per restituire elementi in un ordine casuale, ad esempio.

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

Linq definisce l'interfaccia IOrderedEnumerable per questo scopo.

Re " non modificato " (Risposta di NM) - nota che molti contenitori complessi come Dizionario non garantiscono la conservazione dell'ordine. A volte l'aggiunta di un elemento lo farà apparire per ultimo (dando l'impressione che l'ordine sia preservato), e talvolta farà riorganizzare i secchi interni, dando un ordine completamente diverso.

Cose come SortedList <, > ecc. ovviamente hanno le loro regole.

Direi che per la maggior parte delle raccolte è sicuro supporre questo. Non è al di là dei regni di possibilità che una determinata raccolta possa implementare l'enumeratore in modo non deterministico, ma probabilmente non accadrà ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top