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