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
中的对相同的键和值。
编辑:这是调试器中报告的array1
和array2
的值:
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
。
Prop1
和 Prop3
的所有对都保留在设置的差异中,而 Prop2
的所有对都已删除。
【问题讨论】:
一个包含失败数据的数组示例会很有帮助。 @Magnus 刚刚添加了失败的数据 调试器视图并不能真正告诉我们更多信息。A
这里是什么? 1
这里是什么?而且,确实是从那件事开始的内容。
我用两个包含 new KeyValuePair<string, object>[] new KeyValuePair<string, object>("Prop1", 1), new KeyValuePair<string, object>("Prop2", "A"), new KeyValuePair<string, object>("Prop2", "B"), new KeyValuePair<string, object>("Prop3", 3), new KeyValuePair<string, object>("Prop1", 2), ;
的相等数组对其进行了测试,它按预期工作,结果为空。
KeyValuePair 不会覆盖 Equals() 方法。当您通过转换为(对象)将其装箱时,您将获得 Object.Equals()。这对于两个装箱的值永远不会正确,因为它会比较对象身份。
【参考方案1】:
KeyValuePair
使用默认方法来构造相等性。如果两个KeyValuePair<TKey, TValue>
的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?