#c_sharp
Есть списки сложных объектов. Нужно как-то их сравнить. Попытка применить List.Distinct<> и прочие методы почему-то проваливается.
Ответы
Ответ 1
Разность списков находится методом Except: double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 }; double[] numbers2 = { 2.2 }; IEnumerableonlyInFirstSet = numbers1.Except(numbers2); Пересечение - методом Intersect: int[] id1 = { 44, 26, 92, 30, 71, 38 }; int[] id2 = { 39, 59, 83, 47, 26, 4, 30 }; IEnumerable both = id1.Intersect(id2); Для того, чтобы эти методы работали над сложными объектами, необходимо, чтобы в классах этих объектов был переопределён оператор сравнения. Если переопределить оператор сравнения по каким-либо причинам невозможно, можно использовать версии методов Except и Intersect, которым вторым параметром передаётся компаратор - объект класса, реализующего интерфейс IEqualityComparer, в котором содержится логика сравнения объектов вашего класса. Метод Distinct не сработал, потому что он возвращает уникальные элементы одной коллекции, а не пересечение или разность двух коллекций. Для его корректной работы также требуется переопределённый оператор сравнения или компаратор. Ответ 2
Начну с того, что Distinct - это метод не класса List<>, а метод статического класса Enumerable из пространства имен System.Linq. Этот метод расширяет интерфейс IEnumerable<>. Конкретно для вашей задачи можно использовать методы Intersect и Except. Из возможных проблем вижу две: Ошибка новичка: потеряли using System.Linq; Без этой строки методы-расширения IEnumerable<> работать не будут. Объект, который содержится в списке, некорректно реализует метод Equals. Тут выходом может быть написание реализации интерфейса IEqualityComparer<>. Но зачем вы вообще используете списки? Посмотрите в сторону HashSet<> - там есть все методы для выполнения операций над множествами.Ответ 3
Нашел ответ сам. нужно для собственных объектов было сделать правильный дефолтный компаратор. после этого методы стали работать
Комментариев нет:
Отправить комментарий