SequenceEqual не работает ниже при сравнении класса - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь сравнить следующие данные ниже.Почему SequenceEqual не работает ниже?Я создал два списка классов и хочу сравнить.

        public partial class Product
        {
            public int ProductId { get; set; }
            public string ProductName { get; set; }
            public string ProductDescription { get; set; }
        }

        List<Product> product1 = new List<Product>();
        List<Product> product2 = new List<Product>();

        product1.Add(new Product
        {
            ProductId = 1,
            ProductName = "TV",
            ProductDescription = "Television Set"
        });

        product2.Add(new Product
        {
            ProductId = 1,
            ProductName = "TV",
            ProductDescription = "Television Set"
        });


        if (product1.SequenceEqual(product2))
        {
            Console.WriteLine("equal data");
        }
        else
        {
            Console.WriteLine("Not equal data");
        }

Ответы [ 2 ]

0 голосов
/ 02 января 2019

По умолчанию метод SequenceEqual сравнивает элементы в коллекции с использованием средства сравнения по умолчанию, которое выполняет сравнение ссылок & mdash; См. страницу официальной документации , особенно раздел Примеры .

Если вы хотите сравнить данные объектов, а не ссылки, у вас есть два варианта (которые я взял со страницы, ссылки на которую приведены выше):

  • имеет класс Product, реализующий интерфейс IEquatable<Product>; или
  • создайте отдельный класс, который реализует интерфейс IEqualityComparer<Product>, и используйте перегрузку SequenceEqual, которая принимает экземпляр IEqualityComparer<T>

Я предлагаю вам прочитать страницу документации для получения более подробной информации и примеров того, как реализовать эти два варианта.

0 голосов
/ 02 января 2019

SequenceEqual сравнивает две последовательности, чтобы определить, содержат ли они одинаковые объекты.В вашем случае они не.Они содержат различные ссылки Product.

Если вы измените свой код на использование одинаковых Product в каждом списке, то SequenceEqual вернет `true '

var product = new Product
{
    ProductId = 1,
    ProductName = "TV",
    ProductDescription = "Television Set"
};

product1.Add(p);
product2.Add(p);


if (product1.SequenceEqual(product2))
{
    Console.WriteLine("equal data");
}
else
{
    Console.WriteLine("Not equal data");
}

Почему?Поскольку в этом примере списки содержат один и тот же объект.

Прочтите это для получения дополнительной информации о том, как SequenceEqual сравнивает две последовательности.

Если вы хотите SequenceEqualчтобы вернуть true, если свойства класса Product совпадают, вам необходимо переопределить метод Equals для класса Product.

EDIT

Как уже упоминалось, лучше применять интерфейс IEqualityComparer<T> вместо прямого переопределения метода Equals.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...