Как сделать ExceptBy по нескольким свойствам

87
14 марта 2022, 02:50

Есть класс

 class Nomenclatura
    {
        public int Id { get; set; }
        public string Razdel { get; set; }
        public string Proizvoditel { get; set; }
        public string IdTovara { get; set; }
        public string Nazvanie { get; set; }
        public string Url { get; set; }
    }

Есть два List<Nomenclatura>.

var list1 = new List<Nomenclatura>();
list1.Add(new Nomenclatura { Id = 1, IdTovara = "3" });
var list2 = new List<Nomenclatura>();
list2.Add(new Nomenclatura { Id = 2, IdTovara = "2" });
list2.Add(new Nomenclatura { Id = 1, IdTovara = "3" });

Хочу получить на выходе элементы которые есть в list2 и нет в list1. Для этого использую Except. Всё хорошо но на данный момент у меня есть сравнение только по одному свойству, а мне хочется по нескольким. Я делал так, но скорость вообще ниочём

 var differences = list2.Where(l2 =>
            !list1.Any(l1 => l1.Id == l2.Id&& l1.IdTovara== l2.IdTovara)).ToList();
Answer 1
  internal class MyComparer : IEqualityComparer<Nomenclatura>
    {
        public bool Equals(Nomenclatura x, Nomenclatura y)
        {
            if (string.Equals(x.IdTovara, y.IdTovara, StringComparison.OrdinalIgnoreCase)&&
                string.Equals(x.Nazvanie, y.Nazvanie, StringComparison.OrdinalIgnoreCase)&&
                string.Equals(x.Proizvoditel, y.Proizvoditel, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
            return false;
        }
        public int GetHashCode(Nomenclatura obj)
        {
            return obj.IdTovara.GetHashCode() ^ obj.Nazvanie.GetHashCode() ^ obj.Proizvoditel.GetHashCode();
        }
    }

А вот использование его

var list1 = new List<Nomenclatura>();
list1.Add(new Nomenclatura { Id = 1, IdTovara = "3", Nazvanie = "naz", Proizvoditel = "proiz" });
var list2 = new List<Nomenclatura>();
list2.Add(new Nomenclatura { Id = 1, IdTovara = "2", Nazvanie = "naz", Proizvoditel = "proiz" });
list2.Add(new Nomenclatura { Id = 2, IdTovara = "3", Nazvanie = "naz", Proizvoditel = "proiz" });  
var onlyDelhiResidents = list2.Except(list1, new MyComparer ()).ToList();
READ ALSO
Как реализовать правильный обход по матрице?

Как реализовать правильный обход по матрице?

Дело такое, что на учебе было дано заданиеЗадача кажется не из простых и до решения до сего момента не могу прийти

115
Как работают виртуальные функции в c#?

Как работают виртуальные функции в c#?

Есть ли вообще понятие таблицы виртуальных функций в шарпе? Допустим есть иерархия классов, в классе на вершине иерархии виртуальный метод,...

250
С# проверка параметров

С# проверка параметров

ПомогитеКак сделать проверку, передается ли в метод хоть какое то числовое значение?

85
Сборка C# проекта через .Net Core SDK 1.1.3 через cmd

Сборка C# проекта через .Net Core SDK 1.1.3 через cmd

Недавно начал курс по Web ,а для сборки задания нуженNet Core SDK 1

103