Соответствует ли Dictionary.Keys.List () [i] Dictionary.Values.ToList () [i]? - PullRequest
7 голосов
/ 10 февраля 2011

У меня есть Dictionary тип данных.Мой вопрос: Dictionary.Keys.ToList()[i] всегда соответствует Dictionary.Values.ToList()[i]?То есть будет ли следующий тест всегда проходить

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

Ответы [ 4 ]

6 голосов
/ 10 февраля 2011

Я бы сказал «да» на основании этого из MSDN :

Порядок значений в Dictionary.ValueCollection не указан, но он соответствует порядку, связанному сключи в Dictionary.KeyCollection, возвращаемые свойством Keys.

1 голос
/ 10 февраля 2011

Проверка записи MSDN для Dictionary.Keys Свойство :

Порядок ключей в Dictionary.KeyCollection не указан, но он совпадает с порядком связанных значений в Dictionary.ValueCollection, возвращаемых свойством Values.

0 голосов
/ 10 февраля 2011

Reflector говорит, что в Framework 2.0 - 4.0 и KeyCollection, и ValueCollection перечисляются в коллекции dictionary.entries. Поэтому порядок будет таким же. И, кстати, такой же порядок будет для перечисления по самому словарю (KeyValuePairs).

0 голосов
/ 10 февраля 2011

В вашем коде - да. Но если вы переопределите GetHashCode () в U Class и затем внесете некоторые изменения, которые изменят значение GetHashCode () и вызовут Assert, возможно, что это будет false, потому что Dictionary реализован в виде хеш-таблицы. Следующий код возвращает 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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...