使用LINQ查询列表的最佳方法

时间:2011-02-23 02:06:10

标签: c# linq

我有一个集合

IEnumerable<Project>

我希望根据项目的Id属性进行过滤,以包含列表中的任何ID:

List<int> Ids

执行where子句以检查列表中是否包含属性的最佳方法是什么。

5 个答案:

答案 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));