我有一个集合最好的方式来使用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查找项目,这使得此方法的吸引力降低。