2016-05-25 4 views
0

У меня есть метод, который принимает два списка в качестве аргументов и возвращает список с объектами, разделяемыми двумя аргументами, путем сравнения их имени. Это выглядит так:Выбор объектов из двух списков объектов

static List<Department> InCommon(List<Department> list_a, List<Department> list_b) 
{ 
    List<Department> a_list = new List<Department>(); 
    var names = list_b.Select(item => item.Name); 
    a_list = list_a.Where(item => names.Contains(item.Name)).ToList(); 
    return a_list; 
} 

Мне нужен второй метод, который делает что-то подобное. Он должен иметь возможность возвращать объекты в list_a после удаления объектов из него list_b. list_a минус list_b, так сказать. Я подозреваю, что

List<T>.Except 

может быть решением, но как я могу это достичь?

ответ

0

Для использования Except вам необходимо будет ввести IEqualityComparer<Department>, который сравнивает два экземпляра Department по их объектам Name.

Так простой способ может быть таким:

return list_a.Where(a => list_b.All(b => a.Name != b.Name)).ToList(); 

Это принимает все элементы из list_a с Name что не в list_b больше появляться.


Для версии Except вам понадобилась бы IEqualityComparer<Department> так:

public class DepartmentByNameComparer : IEqualityComparer<Department> 
{ 
    public bool Equals(Department x, Department y) 
    { 
     return x.Name == y.Name; 
    } 
    public int GetHashCode(Department obj) 
    { 
     return obj.Name.GetHashCode(); 
    } 
} 

Тогда вы могли бы назвать Except так:

return list_a.Except(list_b, new DepartmentByNameComparer()).ToList(); 
+0

Brilliant. Ваше первое предложение работает как шарм. Спасибо. – msdb83

Смежные вопросы