2011-02-10 13 views

risposta

1

Controllo della voce MSDN per Dictionary.Keys Property:

L'ordine dei tasti nella Dictionary.KeyCollection è specificato, ma è lo stesso ordine valori associati nel Dictionary.ValueCollection restituiti dalla proprietà Values.

+0

E 'corretto dire SortedDictionary aver specificato ordine sui tasti? –

+0

@RayCheng La documentazione che ho citato si riferisce alla classe 'Dictionary'. Per rispondere alla tua domanda, devi controllare la documentazione di 'SortedDictionary.Keys', che dice" Le chiavi nel 'SortedDictionary .KeyCollection' sono ordinate in base alla proprietà' Comparer' e sono nello stesso ordine come i valori associati in 'SortedDictionary .ValueCollection' restituiti dalla proprietà' Values'. " Quindi la risposta alla tua domanda è * sì *. – CodesInChaos

6

Direi di sì sulla base di questo da MSDN:

L'ordine dei valori nella Dictionary.ValueCollection non è specificato, ma è lo stesso ordine delle chiavi associate del Dictionary.KeyCollection restituito dalla proprietà Keys.

+1

+1: per citare MSDN prima – Simon

0

Nel codice - sì. Ma se si esegue l'override di GetHashCode() nella classe U e si apportano alcune modifiche che cambieranno il valore di GetHashCode() e si invocherà Assert, è possibile che sia falso, perché il dizionario viene implementato come tabella hash. Il codice successivo restituisce false:

class Program 
    { 
     static void Main(string[] args) 
     { 
      Dictionary<A, int> d = new Dictionary<A, int>(); 
      for (int i = 1; i <= 10; i++) 
      { 
       d.Add(new A { Hash = i}, i); 
      } 
      DictionaryTest(5, d); 
     } 

     public static void DictionaryTest(int i, Dictionary<A, int> dict) 
     { 
      A key = dict.Keys.ToList()[i]; 
      key.Hash = 4; 
      Console.WriteLine(dict[key].Equals(dict.Values.ToList()[i])); 
      Console.ReadKey(); 
     } 
    } 

    public class A 
    { 
     public int Hash { get; set; } 

     public override bool Equals(object obj) 
     { 
      return this.GetHashCode() == obj.GetHashCode(); 
     } 
     public override int GetHashCode() 
     { 
      return Hash; 
     } 
    } 
+1

In caso di violazione del contratto di 'Dictionary' si ottiene un comportamento indefinito. Sorpresa sorpresa. "Finché un oggetto viene utilizzato come chiave nel dizionario , non deve cambiare in alcun modo che influisce sul suo valore hash." – CodesInChaos

+0

Non sarà falso, perché l'ordine delle voci sarà altro, ma lo stesso di nuovo. –

+0

Ma è possibile e alcune persone hanno commesso questo errore. Esse sovrascrivono il metodo GetHashCode() e utilizzano gli oggetti con Dizionario. – Rover

0

Riflettore dice, che nel quadro 2,0-4,0 sia KeyCollection e ValueCollection sono enumerazione sopra collezione dictionary.entries. Ecco perché l'ordine sarà lo stesso. E a proposito lo stesso ordine sarà per l'enumerazione sul dizionario stesso (KeyValuePairs).

+0

È importante che non solo l'attuale implementazione lo faccia, ma che il contratto di 'Keys' e' Values' lo garantisca. Altrimenti potrebbe mostrare un comportamento diverso nelle versioni future o nelle diverse implementazioni. – CodesInChaos

+0

Bene, le specifiche potrebbero cambiare anche nelle versioni future. Ho appena detto com'è implementato ora e perché l'ordine è il samw. –

Problemi correlati