2011-02-10 11 views

Respuesta

1

Comprobación de la entrada de MSDN para Dictionary.Keys Property:

El orden de las claves en el Dictionary.KeyCollection no está especificado, pero es del mismo orden que la valores asociados en la Dictionary.ValueCollection devuelta por la propiedad Values.

+0

¿Es correcto decir que SortedDictionary ha especificado el orden en las teclas? –

+0

@RayCheng La documentación que cité se refiere a la clase 'Diccionario'. Para responder a su pregunta, debe verificar la documentación de 'SortedDictionary.Keys', que dice" Las claves en 'SortedDictionary .KeyCollection' se ordenan según la propiedad' Comparer' y están en el mismo orden como los valores asociados en 'SortedDictionary .ValueCollection' devueltos por la propiedad' Values'. Así que la respuesta a tu pregunta es sí*. – CodesInChaos

6

yo diría que sí en base a esto desde MSDN:

El orden de los valores en el Dictionary.ValueCollection no está especificado, pero es del mismo orden que las claves asociadas en la Dictionary.KeyCollection devuelto por la propiedad Keys.

+1

+1: por mencionar MSDN first – Simon

0

En su código - sí. Pero si reemplaza GetHashCode() en U Class y luego realiza algunos cambios que cambiarán el valor de GetHashCode() e invocarán a Assert, es posible que sea falso, porque Dictionary se implementa como una tabla hash. El siguiente código devuelve falso:

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

Si infringe el contrato de 'Dictionary', obtiene un comportamiento indefinido. Sorpresa sorpresa. "Siempre que un objeto se utilice como clave en el Diccionario , no debe cambiar de ninguna manera que afecte su valor hash". – CodesInChaos

+0

No será falso, porque el orden de las entradas será diferente, pero igual nuevamente. –

+0

Pero es posible y algunas personas cometieron este error. Anulan el método GetHashCode() y usan objetos con Dictionary. – Rover

0

Reflector dice, que en Framework 2.0 - 4,0, tanto KeyCollection y ValueCollection está enumerando sobre la recolección dictionary.entries. Es por eso que el orden será el mismo. Y, por cierto, el mismo orden será para enumerar el propio diccionario (KeyValuePairs).

+0

Es importante que no solo lo haga la implementación actual, sino que el contrato de 'Keys' y' Values' lo garantice. De lo contrario, podría exhibir un comportamiento diferente en futuras versiones o diferentes implementaciones. – CodesInChaos

+0

Bueno, las especificaciones también podrían cambiar en futuras versiones. Acabo de decir cómo se implementó ahora y por qué el orden es el samw. –