2013-03-25 77 views
0

我试图找到列表中的哪些项目填充了特定条件。在包含对象的属性的列表中查找

我有一个List<Employee>,并且每个Employee都有一个List<Role>属性。每个Role都有一个ID作为属性。我正在尝试查找列表中包含某个Role ID的所有Employee。这里是我的非工作示例:

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

另外给出答案:[List .Contains()](http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx)不接受谓词。它接受'T'类型的元素并使用元素的类型'IEquatable .Equals'实现。 – 2013-03-25 06:52:09

+0

您可能会考虑使用角色ID的HashSet 而不是列表。 – 2013-03-25 07:10:38

回答

6

使用Enumerable.Any

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

你可以改变你的ContainsAny(因为你只是检查是否员工匹配的角色的任何你的病情):

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

请注意,这不会是一个非常有效的APPR每一个员工都必须被检查,每个员工的每一个角色。如果你需要使用同一组的员工,但不同的角色ID经常这样做,你可以建立从角色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]) 
{ 
    .... 
} 
相关问题