2011-02-23 98 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查找项目,这使得此方法的吸引力降低。