У меня есть два массива 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
удалены.