【发布时间】: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 中的对相同的键和值。
编辑:这是调试器中报告的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 的键的值类型为 object{string},而其他对的值类型为 object{int}。
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()。这对于两个装箱的值永远不会正确,因为它会比较对象身份。
标签: c# equality keyvaluepair