2012-12-21 27 views
9

Dire che ho un Dictionary e aggiungo ogni voce key e value in un ordine specifico.
Ora, se voglio in seguito essere in grado di iterare questo Dictionary nello stesso ordine sono state aggiunte voci, è l'ordine che ottengo con il semplice ciclo foreach su questo dizionario?Iterare sul dizionario con foreach, in quale ordine è fatto?

In caso contrario, sarei lieto di sapere come posso farlo, so che questo può essere fatto facilmente con List invece di Dictionary ma io non voglio.

Grazie

+4

No, il dizionario non mantiene l'ordine. Sfortunatamente, penso che tu debba usare una lista. – phoog

+0

usa un 'IEnumerable >' invece (ad esempio un elenco <>) – sehe

+2

@sehe Dictionary * è * un 'IEnumerable >'. – phoog

risposta

15

Normale Dictionary non garantisce l'ordine degli articoli.

È necessario OrderedDictionary se si desidera mantenere gli articoli dell'ordine in cui sono aggiunti. Si noti che non esiste una versione generica di questa classe in .Net framework, quindi è necessario rinunciare ad alcuni tipi di sicurezza o trovare altre implementazioni (ad esempio https://www.codeproject.com/Articles/18615/OrderedDictionary-T-A-generic-implementation-of-IO come suggested by Tim S).

In alternativa, se O (log n) ricerca è soddisfacente e le chiavi devono essere ordinate - SortedDictionary.

+2

Nota che questa classe non usa i generici e quindi non è sicura dal punto di vista del tipo. Se desideri che la tua raccolta utilizzi i generici (lo raccomando), usa qualcosa come questa implementazione di "OrderedDictionary": http://www.codeproject.com/Articles/18615/OrderedDictionary-TA-generic-implementation- di-IO –

2

Dictionary s sono tabelle hash, il che significa che non è possibile garantire che l'iterazione le coppie di loro tornerà nello stesso ordine in cui sono stati aggiunti.

Ogni coppia è un KeyValuePair<T_K, T_V>, quindi è possibile avere un List<KeyValuePair<string, string>> che consente di eseguire iterazione nell'ordine in cui vengono aggiunti se è ciò che è necessario.

+0

Puoi spiegare di più su' Elenco > ', indovina che non intendevi l'elenco dei dizionari, non è vero? – JavaSa

+1

@JavaSa Quando si enumera 'Dizionario' si ottiene un'enumerazione di' KeyValuePair 's, quindi stavo solo usando un elenco. La risposta di Alexei Levenkov è sicuramente più corretta anche se – climbage

2

L'ordinamento interno del dizionario dipenderà dalla funzione di hash utilizzata. Tuttavia, se hai bisogno di una visualizzazione ordinata dei dati, puoi utilizzare Enumerable.OrderBy.

Problemi correlati