2013-03-25 8 views
0

Я пытаюсь найти, какие элементы в моем списке заполняют определенные критерии.Поиск в списке, который содержит атрибут объекта

У меня есть List<Employee>, и каждый Employee имеет атрибут List<Role>. Каждый Role имеет атрибут ID. Я пытаюсь найти все Employee s, у которых есть определенный Role ID в списке. Вот мой нерабочим образец:

var query = EmployeeList.Where(employee=> employee.Roles.Contains(role => role.ID == roleID)).ToList(); 
+0

Кроме того к указанным ответам: [Список .Contains()] (http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx) не принимает предикат. Он принимает элемент типа 'T' и использует тип элемента' IEquatable . Реализация Equals'. –

+0

Вы можете использовать HashSet идентификаторов роли, а не список. –

ответ

6

Использование Enumerable.Any

var query = EmployeeList.Where(employee => employee.Roles 
                .Any(role => role.Id == roleID)) 
                .ToList(); 
4

Вы можете просто изменить ваш Contains к Any (как вы только проверить ли любой из ролей спичек сотрудников ваше состояние):

var query = EmployeeList.Where(employee => employee.Roles 
               .Any(role => role.ID == roleID)) 
         .ToList(); 

Обратите внимание, что это не будет ужасно эффективным appr oach - каждый сотрудник должен быть проверен, и каждая роль каждого сотрудника. Если вам нужно сделать, это часто с тем же набором сотрудников, но разные идентификаторы ролей, вы можете создать поиск от роли ID сотрудников:

var lookup = EmployeeList.SelectMany(e => e.Roles, 
            (e, r) => new { Employee = e, Role = e }) 
         .ToLookup(pair => pair.Role.ID, 
            pair => pair.Employee); 

Вы можете просто использовать:

foreach (var employee in lookup[roleID]) 
{ 
    .... 
} 
Смежные вопросы