2013-03-25 75 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]) 
{ 
    .... 
} 
相關問題