【问题标题】:How are KeyValuePairs compared for equality?KeyValuePairs 如何比较相等?
【发布时间】:2019-02-13 14:33:08
【问题描述】:

我有两个KeyValuePair<string, object> 数组。我正在比较两个数组,但注意到当KeyValuePair 的值是转换为对象的值类型时,例如object{int},具有相同键和值值的两对不被视为相等。但是,当引用类型转换为值时,例如object{string},具有相同键和值值的两对被认为是相等的。

我在两个数组上使用.Except() 方法时发现了这个问题,并注意到虽然它们相同,但只有具有字符串值的对被设置差异删除。根据我对KeyValuePair 的平等比较器的研究,平等是价值,而不是参考。奇怪的是,字符串值对的引用无论如何都应该不同。

// array1 and array2 contain the same keys with identical values here

var array1 = GetOldItems(); // This returns a KeyValuePair<string, object>[]
var array2 = GetNewItems(); // This returns a KeyValuePair<string, object>[]
var diff = array1.Except(array2); // The difference is all pairs with non-string value

diff 最终成为 array1 中所有具有非字符串值的对,即使 array1 中的所有对具有与 array2 中的对相同的键和值。

编辑:这是调试器中报告的array1array2 的值:

{System.Collections.Generic.KeyValuePair<string, object>[5]}
[0]: {[Prop1, 1]}
[1]: {[Prop2, A]}
[2]: {[Prop2, B]}
[3]: {[Prop3, 3]}
[4]: {[Prop1, 2]}

Prop2 的键的值类型为 object{string},而其他对的值类型为 object{int}

Prop1Prop3 的所有对都保留在设置的差异中,而 Prop2 的所有对都已删除。

【问题讨论】:

  • 一个包含失败数据的数组示例会很有帮助。
  • @Magnus 刚刚添加了失败的数据
  • 调试器视图并不能真正告诉我们更多信息。 A 这里是什么? 1 这里是什么?而且,确实是从那件事开始的内容。
  • 我用两个包含 new KeyValuePair&lt;string, object&gt;[] { new KeyValuePair&lt;string, object&gt;("Prop1", 1), new KeyValuePair&lt;string, object&gt;("Prop2", "A"), new KeyValuePair&lt;string, object&gt;("Prop2", "B"), new KeyValuePair&lt;string, object&gt;("Prop3", 3), new KeyValuePair&lt;string, object&gt;("Prop1", 2), }; 的相等数组对其进行了测试,它按预期工作,结果为空。
  • KeyValuePair 不会覆盖 Equals() 方法。当您通过转换为(对象)将其装箱时,您将获得 Object.Equals()。这对于两个装箱的值永远不会正确,因为它会比较对象身份。

标签: c# equality keyvaluepair


【解决方案1】:

KeyValuePair 使用默认方法来构造相等性。如果两个KeyValuePair&lt;TKey, TValue&gt;Key 属性对其类型的默认相等性比较为相等,并且Value 属性对其类型的默认相等性比较为相等,则它们相等。否则他们不是。

我没有找到您报告的内容。例如:

new[] { new KeyValuePair<string, object>("a", 2) }.Except(
  new[] { (new KeyValuePair<string, object>("a", 2))})

返回一个空序列,因为两个数组的内容是相同的。

我想知道你是否有一些对,其中值是一些不覆盖Equals() 的引用类型,因此只有当它们是同一个对象时才被认为是相等的。换句话说,kvp1.Value.Equals(kvp2.Value) 将返回 false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-31
    • 2014-09-20
    • 2012-02-15
    • 2021-04-19
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多