我有两个
我在对两个数组使用
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
的键值对已被移除。
A
是什么?这里的1
是什么?而且,真正重要的是以什么内容开始的。 - undefinednew 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), };
,结果如预期,我得到了空结果。 - undefined