KeyValuePairs如何比较相等?

问题描述 投票:1回答:1

我有两个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的对都已被删除。

c# equality keyvaluepair
1个回答
0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.