Ответ 1
Для этого вам не требуется соединение:
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 like this :)
var comparer = ProjectionEqualityComparer<Employee>.Create(x => x.Name);
var filteredEmployees = groupA.Except(groupB, comparer);