Для этого вам не нужно объединяться:
var filteredEmployees = groupA.Except(groupB);
Обратите внимание, что это будет последовательность уникальных сотрудников - поэтому, если в groupA
есть дубликаты, они появятся только один раз в filteredEmployees
. Конечно, это также предполагает, что у вас есть разумный сравнитель равенства 1 . Если вам нужно конкретно указать имя, вы можете использовать ExceptBy
из MoreLINQ :
var filteredEmployees = groupA.ExceptBy(groupB, employee => employee.Name);
Или не заходя в стороннюю библиотеку:
var groupBNames = new HashSet<string>(groupB.Select(x => x.Name));
var filteredEmployees = groupA.Where(x => !groupBNames.Contains(x.Name));
1 Как указано в комментариях, вы можете передать IEqualityComparer<T>
в качестве аргумента Except
. У меня есть ProjectionEqualityComparer
класс в MiscUtil , который облегчает создание компаратора того типа, который вам нужен:
// I can't remember the exact method name, but it's like this :)
var comparer = ProjectionEqualityComparer<Employee>.Create(x => x.Name);
var filteredEmployees = groupA.Except(groupB, comparer);