2011-02-23 96 views
2

我有一個集合最好的方式來使用LINQ對查詢列表

IEnumerable<Project> 

,我想根據項目的id屬性包含任何的ID在列表中做一個過濾器:

List<int> Ids 

什麼是做一個where子句來檢查屬性是否包含在列表中的最佳方法。

回答

5
var filteredProjectCollection = projectCollection.Where(p => Ids.Contains(p.id)); 
1

var nonExcludedProjects = from p in allprojects where Ids.Contains(p => p.Id) select p;

0

我不知道,我明白你的問題,但我會出手。

如果您有:IEnumerable的枚舉, 並且要對其進行過濾,使得其僅是,則爲也存在列表中的項目:列出清單,然後 :IEnumerable的最終= enumerable.Where(E =>列表。含有(E));

1

如果您打算使用.Where(p => list.Contains(p))答案之一,您應該首先將HashSet置於列表之外,以便它不必執行O(n)每次搜索。這將從O(mn)到O(m + n)的運行時間縮短。

2

您可以使用Except方法來獲得更有效的實現:

var specialProjects = Ids.Select(id => new Project(id)); 
var filtered = projects.Except(specialProjects, comparer); 

的棘手的事情是Except作品與同類型的兩個集合 - 所以你想擁有的項目的兩個集合。您可以通過創建新的「虛擬」項目並使用comparer來比較僅基於ID的項目。

或者,您可以僅在ID集合上使用Except,但是可能需要使用ID查找項目,這使得此方法的吸引力降低。