Могут ли .NET проверять массивы на эквивалентность, а не просто равные ссылки? - PullRequest
6 голосов
/ 28 апреля 2011
var a = new double[] {1, 2, 3};
var b = new double[] {1, 2, 3};
System.Console.WriteLine(Equals(a, b)); // Returns false

Однако я ищу способ сравнения массивов, который бы сравнивал внутренние значения вместо ссылок. Есть ли способ сделать это в .NET?

Кроме того, хотя я понимаю, Equals сравнивая ссылки, GetHashCode также возвращает разные значения для этих двух массивов, что, по моему мнению, не должно происходить, поскольку они имеют одинаковые внутренние значения.

Ответы [ 2 ]

7 голосов
/ 28 апреля 2011

Полагаю, вы ищете метод Enumerable.SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>).

var a = new double[] {1, 2, 3};
var b = new double[] {1, 2, 3};
System.Console.WriteLine(a.SequenceEqual(b)); // Returns true

Что касается проблемы с GetHashCode, возвращающей разные значения, помните, что вы имеете дело с двумя разными значениямиВот. Вы не сравниваете массивы, вы сравниваете две ссылки на массивы.

Сравнение по умолчанию для ссылочных типов должно быть согласованным.Если вам нужно что-то еще, помните, что для этого есть встроенная модель, использующая IEqualityComparer<T>, которая позволяет определять пользовательское сравнение на равенство на основе конкретных потребностей, которые не соответствуют стандартному эталонному шаблону равенства.

5 голосов
/ 28 апреля 2011

ОБНОВЛЕНИЕ: исправлен код для использования правильного метода сравнения (спасибо @CodesInChaos за указание на это).

Если вы в .NET 4, вы можете использовать интерфейс IStructuralEquatable:

IStructuralEquatable c = b;
Console.WriteLine(c.Equals(a, StructuralComparisons.StructuralEqualityComparer));

Этот вопрос содержит более подробную информацию.

...