2013-08-19 5 views
5

Io uso un Dictionary<string, Item> per memorizzare i propri articoli.
Il motivo dell'utilizzo di un dizionario è che le chiavi sono univoche e l'accesso è veloce.Voce dizionario

Nella maggior parte dei casi, utilizzo il dizionario solo per accedere a singoli articoli. Ma in un caso devo scorrere il dizionario - qui ho bisogno di avere gli elementi in ordine sono stati aggiunti.

So solo che il dizionario utilizza internamente un hashtable, ma non so come sia organizzato.

Domanda:
sono gli elementi di un dizionario ordinato come sono aggiunti?
Cosa succede all'ordine quando gli articoli vengono aggiunti o rimossi?

+0

È possibile utilizzare 'OrderedDictionary' in C# per il dizionario ordinato, vedere MSDN: http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx – wudzik

+0

Dai un'occhiata a questa grande risposta sullo stesso argomento. http://stackoverflow.com/questions/6384710/why-is-a-dictionary-not-ordered?rq=1 –

+1

@KingKing: 'OrderedDictionary' è implementato anche come TabellaHash (accanto array) ma è ordinato.Tuttavia, anche se so che si tratta di un'implementazione di HashTable, non necessariamente devo sapere che non è ordinato dalla natura. –

risposta

4

Non sono ordinati affatto. L'ordine degli elementi in un dizionario non è deterministico.

MSDN: "The order in which the items are returned is undefined."

Si potrebbe usare un OrderedDictionary invece accedere a un elemento tramite indice. Oppure, se si desidera che venga ordinato tramite la chiave, è possibile utilizzare uno SortedDictionary.

AggiornamentoWhy is a dictionary not ordered by nature?

+0

Risposta migliore perché include informazioni su 'OrderedDictionary' da .NET 4.5 – wudzik

+0

Una parola di avvertenza sulla classe SortedDictionary, il recupero è O (log n) e l'inserimento è ancora peggiore. – flindeberg

+0

@wudzik 'OrderedDictionary' è in circolazione da .Net 2 –

0

I dizionari non sono affatto ordinati, quindi non è possibile fare affidamento sui valori lì. Potresti provare a utilizzare OrderedDictionary. Se si preferisce uno generico, controllare il seguente link:

No generic implementation of OrderedDictionary?

+0

@wudzik È in circolazione da .NET 2, ma non è generico. Il link che ho pubblicato mostra un'implementazione generica per questo. – Artless

+0

ok, mi dispiace, mio ​​male :) – wudzik

0

No, non sono ordinate, come si può leggere in library di Microsoft:

Ai fini del conteggio, ciascun elemento il dizionario viene considerato come una struttura KeyValuePair che rappresenta un valore e la sua chiave . L'ordine in cui vengono restituiti gli articoli non è definito.

1

Se si dispone di uno sguardo a the msdn pages si scopre che (per la vostra prima domanda)

L'ordine in cui vengono restituiti gli oggetti non è definito.

E la risposta alla seconda domanda è che è implementato da una tabella hash.

È impossibile per me raccomandare una linea d'azione migliore senza sapere quali siano le vostre reali esigenze. Ma non appena inizi a dare fastidio con più chiavi e ordini, perderai il tuo recupero O (1).