Почему сравнение каждой пары ключей / значений словаря C # дает другой результат, чем сравнение словарных значений и значений словаря, выполненных одновременно? - PullRequest
1 голос
/ 03 апреля 2019

В настоящее время мне пришлось поместить некоторые данные в словарь, чтобы проверить, соответствуют ли некоторые фактические данные ожидаемым для некоторых моих тестов.

Для задачи я создал словарь, который выглядел примерно так:

Dictionary<string, string> dict = new Dictionary<string, string>(){
    {a, a},
    {b, b},
    {c, c}
};
  1. Сначала я попытался сравнить значения словаря и ключи в условном выражении, как показано ниже, и я был немного удивлен ложным результатом этого условного выражения:

    if(dict.Keys.Equals(dict.Values)) {
        ///// received false as a result here //////
    }
    
  2. Когда я тогда попробовал следующий подход, который заключался в том, чтобы выполнить итерацию по всем элементам словаря и сравнить каждую из их пар ключей-значений, это неожиданно привело к получению ожидаемого (истинного) результата для всех элементов словаря:

    foreach (var item in dict) {
    
        if (item.Key.Equals(item.Value))
        {
            ///// received true as a result /////
        }
        else { other code here }
    }
    

Почему я получил ложный результат для первого описанного подхода?

1 Ответ

3 голосов
/ 03 апреля 2019

Вы ожидаете, что они оба будут ICollection, если вы посмотрите на документы.

Загляните в справочный источник словарного класса. Свойства Keys и Values реализованы с использованием различных типов коллекций.

    // Line 135
    public KeyCollection Keys {
        get {
            Contract.Ensures(Contract.Result<KeyCollection>() != null);
            if (keys == null) keys = new KeyCollection(this);
            return keys;
        }
    }

    // Line 157
    public ValueCollection Values {
        get {
            Contract.Ensures(Contract.Result<ValueCollection>() != null);
            if (values == null) values = new ValueCollection(this);
            return values;
        }
    }

Также, если вы посмотрите на классы KeyCollection и ValueCollection, вы заметите, что нет другой реализации метода Equals(). Поскольку эти классы не являются производными от какого-либо другого класса, вы можете быть уверены, что dict.Keys.Equals(dict.Values) вызовет object.Equals() Метод .

Этот вызов, очевидно, вернет false.

...