KeyValuePairs 如何比较相等?

Posted

技术标签:

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

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

我在两个数组上使用.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 的键的值类型为 objectstring,而其他对的值类型为 objectint

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()。这对于两个装箱的值永远不会正确,因为它会比较对象身份。 【参考方案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。

【讨论】:

以上是关于KeyValuePairs 如何比较相等?的主要内容,如果未能解决你的问题,请参考以下文章

Parallel.ForEach 具有可枚举的 KeyValuePairs?

从 JSON 解码 KeyValuePairs<String: Person>

java中如何比较两个数组确定是不是相等?

js 如何比较两个对象相等

如何判断两个对象的值是不是相等java

HashSet 如何比较元素是不是相等?