为什么比较每个 C# 字典键/值对给出的结果与一次比较字典键和值不同



我目前不得不在字典中输入一些数据,以检查某些实际数据是否与我的某些测试的预期数据相匹配。

对于这项任务,我创建了一个看起来像这样的字典:

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

为什么我得到所描述的第一种方法的错误结果?

如果您查看文档,您希望它们都是ICollection

查看字典类的引用源。KeysValues属性是使用不同的集合类型实现的。

    // 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。

最新更新