L’ordine degli elementi nel dizionario

La mia domanda riguarda l’enumerazione degli elementi del dizionario

// Dictionary definition private Dictionary _Dictionary = new Dictionary(); // 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 kvp in _Dictionary) { Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value)); } 

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

    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.

    Citazione dal doc :

    Ai fini dell’enumerazione, ogni elemento nel 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.

    Se vuoi che gli elementi siano ordinati, usa un OrderedDictionary . Un ordinario hastable / dizionario è ordinato solo in un certo senso del layout di archiviazione.

    Penso di essere 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 riguardo l’uso di OrderedDictionary per quello che vuoi dal momento che la documentazione dice che

    Gli elementi di un OrderedDictionary non sono ordinati dalla chiave, a differenza degli elementi di una class SortedDictionary.

    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 vengono restituiti nell’ordine in cui vengono aggiunti.

    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.

    È ansible ordinare gli articoli al momento dell’enumerazione:

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

    Nel framework 2.0 dovresti prima mettere gli elementi in una lista per ordinarli:

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

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

    TUTTAVIA, è ansible 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.