如何比较KeyValuePairs的相等性?

时间:2019-02-13 14:33:08

标签: c# equality keyvaluepair

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

1 个答案:

答案 0 :(得分: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。