【问题标题】:Why does comparing each of C# Dictionary Key/Value pair gives different result, than comparing Dictionary Keys and Values done at once?为什么比较每个 C# 字典键/值对会给出不同的结果,而不是一次比较字典键和值?
【发布时间】:2019-08-24 16:47:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 不确定,但我认为这是因为 IEnumerable 的 euquals 检查不检查成员的相等性,而是 IEnumerable 本身...
  • Collections 通常不会针对其他集合执行相等性检查。您可以使用 SequenceEquals 扩展方法来比较元素,但这是一个非常边缘的情况,它更多地用于演示目的(为什么您会有一个保证键值相等的字典?)

标签: c# .net string dictionary equals


【解决方案1】:

如果您查看docs.,您希望它们都是ICollection

查看字典类的reference sourceKeysValues 属性是使用不同的集合类型实现的。

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

此外,如果您查看KeyCollectionValueCollection 类,您会注意到Equals() 方法没有其他实现。由于这些类不是从任何其他类派生的,您可以确定dict.Keys.Equals(dict.Values) 将调用object.Equals() Method

这个调用显然会返回 false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多