Member 11381811 Ответов: 3

Как фильтровать и исключать из списка элементы


У меня есть один список object1 {id, name}
и еще один список object2 {id, name}

Я хочу отфильтровать список 1 с элементами списка 2.

Итак, в моем первом списке есть данные
1 Иоанн
2 Джош
3 Энн
4 ручка

мой список истечении данных
3 Энн
4 ручка

Я хочу отфильтровать 1 Список только для того, чтобы иметь 2 записи
1 Иоанн
2 Джош

Что я уже пробовал:

List<object1> items1
List<Object2> items2
List<object1> result = items1.Where(item => items2.Any(x => x.id.Equals(item.id))).ToList();


это не работает

3 Ответов

Рейтинг:
2

F-ES Sitecore

Вы выбираете элементы из items1, которые имеют соответствующий идентификатор в items2, что противоположно тому, что вы хотите. Вы хотите, где нет совпадения, поэтому используйте "!" вместо "не"

List<object1> result = items1.Where(item => !items2.Any(x => x.id.Equals(item.id))).ToList();


Member 11381811

TNX

Maciej Los

5ed!

Рейтинг:
1

Maciej Los

В дополнение к решениям №1 и №2 я бы предложил использовать хорошо известные Перечислимый.Кроме Метода (System.Linq) | Microsoft Docs[^] чтобы получить разницу между двумя списками.
Если вы хотите получить общую часть обоих списков, используйте: Перечислимый.Метод Intersect (System.Linq) | Microsoft Docs[^]


Leo Chapiro

Хорошее решение, а также +5 ! :)

Maciej Los

Спасибо!

Richard Deeming

Единственная проблема с этим заключается в том, что, как я читал, списки бывают разных типов. То Except и Intersect методы работают только со списками одного типа. :)

Maciej Los

Хорошая мысль!
Я считаю, что ОП хочет сравнить одни и те же типы ;)

Рейтинг:
0

Leo Chapiro

Как Ф-Эс компания[^] уже писал, что нужно использовать не - оператор "!".
Также вы ссылаетесь на разные классы (object1 и object2):

List<object1> items1
List<Object2> items2


Вот рабочий пример с универсальным классом "string", чтобы понять, как он работает:

List<string> items1 = new List<string>(new string[] { "John", "Josh", "Ann", "Pen" });
List<string> items2 = new List<string>(new string[] { "Ann", "Pen" });
List<string> result = items1.Where(item => !items2.Any(x => x.Equals(item))).ToList();


Maciej Los

5ed!

Leo Chapiro

Спасибо тебе, Мацей!