我有一個集合最好的方式來使用LINQ對查詢列表
IEnumerable<Project>
,我想根據項目的id屬性包含任何的ID在列表中做一個過濾器:
List<int> Ids
什麼是做一個where子句來檢查屬性是否包含在列表中的最佳方法。
我有一個集合最好的方式來使用LINQ對查詢列表
IEnumerable<Project>
,我想根據項目的id屬性包含任何的ID在列表中做一個過濾器:
List<int> Ids
什麼是做一個where子句來檢查屬性是否包含在列表中的最佳方法。
var filteredProjectCollection = projectCollection.Where(p => Ids.Contains(p.id));
var nonExcludedProjects = from p in allprojects where Ids.Contains(p => p.Id) select p;
我不知道,我明白你的問題,但我會出手。
如果您有:IEnumerable的枚舉, 並且要對其進行過濾,使得其僅是,則爲也存在列表中的項目:列出清單,然後 :IEnumerable的最終= enumerable.Where(E =>列表。含有(E));
如果您打算使用.Where(p => list.Contains(p))答案之一,您應該首先將HashSet置於列表之外,以便它不必執行O(n)每次搜索。這將從O(mn)到O(m + n)的運行時間縮短。
您可以使用Except
方法來獲得更有效的實現:
var specialProjects = Ids.Select(id => new Project(id));
var filtered = projects.Except(specialProjects, comparer);
的棘手的事情是Except
作品與同類型的兩個集合 - 所以你想擁有的項目的兩個集合。您可以通過創建新的「虛擬」項目並使用comparer
來比較僅基於ID的項目。
或者,您可以僅在ID集合上使用Except
,但是可能需要使用ID查找項目,這使得此方法的吸引力降低。