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