Как сравниваются KeyValuePairs на равенство? - PullRequest
0 голосов
/ 13 февраля 2019

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

1 Ответ

0 голосов
/ 13 февраля 2019

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.

...