我有一个集合
IEnumerable<Project>
我希望根据项目的Id属性进行过滤,以包含列表中的任何ID:
List<int> Ids
执行where子句以检查列表中是否包含属性的最佳方法是什么。
答案 0 :(得分:5)
var filteredProjectCollection = projectCollection.Where(p => Ids.Contains(p.id));
答案 1 :(得分:2)
您可以使用Except
方法获得更高效的实施:
var specialProjects = Ids.Select(id => new Project(id));
var filtered = projects.Except(specialProjects, comparer);
棘手的是Except
使用两个相同类型的集合 - 所以你想拥有两个项目集合。您可以通过创建新的“虚拟”项目并使用仅基于ID比较项目的comparer
来实现这一目标。
或者,您可以仅对ID集合使用Except
,但是您可能需要按ID查找项目,这使得此方法不那么吸引人。
答案 2 :(得分:1)
var nonExcludedProjects = from p in allprojects where Ids.Contains(p => p.Id) select p;
答案 3 :(得分:1)
如果你打算使用.Where(p =&gt; list.Contains(p))答案中的一个,你应该首先从列表中创建一个HashSet,这样它就不必进行O(n)每次搜索。这将运行时间从O(mn)减少到O(m + n)。
答案 4 :(得分:0)
我不确定我理解你的问题,但我会有机会。
如果你有:IEnumerable可枚举, 并且您希望对其进行过滤,使其仅包含列表中也存在的项目:列表列表, 那么:IEnumerable final = enumerable.Where(e =&gt; list.Contains(e));