2010-10-24 21 views
74

La mia domanda riguarda enumerare gli elementi DizionarioL'ordine degli elementi nel dizionario

// Dictionary definition 
private Dictionary<string, string> _Dictionary = new Dictionary<string, string>(); 

// add values using add 

_Dictionary.Add("orange", "1"); 
_Dictionary.Add("apple", "4"); 
_Dictionary.Add("cucumber", "6"); 

// add values using [] 

_Dictionary["banana"] = 7; 
_Dictionary["pineapple"] = 7; 

// Now lets see how elements are returned by IEnumerator 
foreach (KeyValuePair<string, string> kvp in _Dictionary) 
{ 
    Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value)); 
} 

In che ordine saranno gli elementi elencati? Posso forzare l'ordine in ordine alfabetico?

+1

possibile duplicato di [L'enumeratore di un dizionario restituisce coppie di valori chiave nell'ordine in cui sono state aggiunte? .Net] (http: // StackOverflow.it/questions/1453190/does-the-enumerator-of-a-dictionarytkey-tvalue-return-key-value-pairs-in-the) – nawfal

risposta

88

L'ordine degli elementi in un dizionario non è deterministico. La nozione di ordine semplicemente non è definita per le hashtables. Quindi non fare affidamento sull'enumerazione nello stesso ordine in cui gli elementi sono stati aggiunti al dizionario. Questo non è garantito.

Quota from the doc:

Ai fini del conteggio, ciascun elemento del dizionario è trattata come una struttura KeyValuePair<TKey, TValue> rappresenta un valore e la relativa chiave. L'ordine in cui vengono restituiti gli articoli non è definito.

+0

Il dizionario non è implementato come un albero come std :: map? In tal caso, un operatore di confronto o un metodo Compare() devono garantire un ordine deterministico ed essere ordinati in ordine alfabetico. –

+15

Se vuoi che un ordine sia garantito usa 'OrderedDictionary'. –

+3

@Darin - a questo scopo, suppongo che SortedDictionary sia più adatto di OrderedDictionary. – SoftMemes

3

Gli array associativi (ovvero le tabelle hash) non sono ordinati, il che significa che gli elementi possono essere ordinati in qualsiasi modo immaginabile.

TUTTAVIA, è possibile recuperare le chiavi dell'array (solo le chiavi), ordinarlo alfabeticamente (tramite una funzione di ordinamento) e quindi lavorarci sopra.

Non posso darti un campione C# perché non conosco la lingua, ma questo dovrebbe essere sufficiente per te stesso.

18

Se si desidera ordinare gli elementi, utilizzare OrderedDictionary. Un ordinario hastable/dizionario è ordinato solo in un certo senso del layout di archiviazione.

+4

OrderedDictionary è nella maggior parte dei casi sbagliato. Non è ordinato per chiave o valore, ma per indice interno. SortedDictionary è quello ordinato in un modo che l'utente può manipolare (chiave predefinita) – Offler

7

Gli articoli verranno restituiti nell'ordine in cui vengono memorizzati fisicamente nel dizionario, che dipende dal codice hash e dall'ordine in cui sono stati aggiunti gli articoli. Quindi l'ordine sembrerà casuale, e man mano che le implementazioni cambiano, non dovresti mai dipendere dall'ordine che rimane invariato.

È possibile ordinare gli articoli durante l'enumerazione di loro:

foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) { 
    ... 
} 

Nel quadro 2.0 si dovrebbe prima mettere gli elementi in un elenco al fine di risolvere loro:

List<KeyValuePair<string, string>> items = new List<KeyValuePair<string, string>>(_Dictionary); 
items.Sort(delegate(KeyValuePair<string, string> x, KeyValuePair<string, string> y) { return x.Value.CompareTo(y.Value); }); 
foreach (KeyValuePair<string,string> kvp in items) { 
    ... 
} 
15

Credo Sono in ritardo per questa festa ma puoi sempre usare SortedDictionary per quello. Si noti che il Discreto è ordinato per Chiave, per impostazione predefinita, a meno che non sia stato specificato un comparatore.

Sono scettico per quanto riguarda l'uso di OrderedDictionary per ciò che si vuole dal momento che la documentazione dice che

Gli elementi di un OrderedDictionary non sono ordinati per la chiave, a differenza gli elementi di una classe SortedDictionary.

8

Per un OrderedDictionary:

var _OrderedDictionary = new System.Collections.Specialized.OrderedDictionary(); 

_OrderedDictionary.Add("testKey1", "testValue1"); 
_OrderedDictionary.Add("testKey2", "testValue2"); 
_OrderedDictionary.Add("testKey3", "testValue3"); 

var k = _OrderedDictionary.Keys.GetEnumerator(); 
var v = _OrderedDictionary.Values.GetEnumerator(); 

while (k.MoveNext() && v.MoveNext()) { 
    var key = k.Current; var value = v.Current; 
} 

Gli articoli sono restituiti nell'ordine in cui vengono aggiunti.

Problemi correlati