LINQ без реализации IEqualityComparer

У меня есть 2 коллекции с разными классами. MyClass1 — имя, возраст и т. д. MyClass2 — ник, возраст и т. д.

Я хочу найти кроме этой коллекции. Что-то типа

list1.Exept(list2, (l1,l2) => l1.Name==l2.Nick);

Но я не могу написать этот код, и мне нужно реализовать свой собственный класс компаратора с интерфейсом IEqualityComparer, и это выглядит очень накладным для этой небольшой задачи. Есть ли элегантное решение?


person Neir0    schedule 24.02.2011    source источник


Ответы (2)


Except действительно не работает с двумя разными типами последовательностей. Я предлагаю вместо этого использовать что-то вроде:

var excludedNicks = new HashSet<string>(list2.Select(x => x.Nick));
var query = list1.Where(x => !excludedNicks.Contains(x.Name));

(Обратите внимание, что это не будет выполнять «отличный» аспект Except. Если вам это нужно, сообщите об этом, и мы сможем решить, что вам нужно.)

person Jon Skeet    schedule 24.02.2011

Ну собери набор из всех никнеймов, потом беги против этого.

var nicknames = new HashSet<string>(list2.Select(l2 => l2.Nick));
var newNames = from l1 in list1
               where !nicknames.Contains(l1.Name)
               select l1;
person Lasse V. Karlsen    schedule 24.02.2011