7 votes

Est-ce que Dictionary.Keys.List()[i] correspond à Dictionary.Values.ToList()[i] ?

J'ai un Dictionary type de données. Ma question est la suivante : est-ce que Dictionary.Keys.ToList()[i] correspondent toujours à Dictionary.Values.ToList()[i] ? En d'autres termes, le test suivant sera-t-il toujours réussi ?

public void DictionaryTest(int i, Dictionary<U,T> dict)
{
  var key = dict.Keys.ToList()[i];
  Assert.AreEqual(dict[key], dict.Values.ToList()[i]); 
}

6voto

SwDevMan81 Points 22634

Je dirais que oui, sur la base de ce qui suit MSDN :

L'ordre des valeurs dans le Dictionary.ValueCollection n'est pas spécifié, mais il est le même que celui des clés associées dans le Dictionary.KeyCollection retourné par la propriété Keys.

1voto

CodesInChaos Points 60274

Vérifier l'entrée MSDN pour Propriété Dictionary.Keys :

L'ordre des clés dans le Dictionary.KeyCollection n'est pas spécifié, mais il est le même que celui des valeurs associées dans le Dictionary.ValueCollection retourné par la propriété Values.

0voto

Rover Points 1176

Dans votre code - oui. Mais si vous surchargez GetHashCode() dans la classe U et que vous apportez ensuite des modifications qui changeront la valeur de GetHashCode() et que vous invoquez Assert, il est possible que l'affirmation soit fausse, car le dictionnaire est implémenté sous la forme d'une table de hachage. Le code suivant renvoie une valeur fausse :

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;
        }
    }

0voto

Sergey Berezovskiy Points 102044

Reflector indique que dans le Framework 2.0 - 4.0, KeyCollection et ValueCollection énumèrent tous deux la collection dictionary.entries. C'est pourquoi l'ordre sera le même. Et d'ailleurs, le même ordre s'appliquera à l'énumération sur le dictionnaire lui-même (KeyValuePairs).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X