2010-07-05 93 views
24

中存在。如果我要过滤的对象列表针对一个特定的ID,我可以这样做:lambda表达式的列表

list.Where(r => r.Id == idToCompare); 

如果有什么,而不是单个idToCompare,我有ID的列表比较?

与预定义列表进行比较的语法是什么?喜欢的东西:

​​

回答

46

如果listOfIds是一个列表,这将工作,但是,List.Contains()是一个线性搜索,所以这是不是非常有效的。

您最好将要查找的id存储在适合搜索的容器中,如Set。

List<int> listOfIds = new List(GetListOfIds()); 
lists.Where(r=>listOfIds.Contains(r.Id)); 
4

可以使用包含()扩展方法:

list.Where(r => listofIds.Contains(r.Id)) 
19
var query = list.Where(r => listofIds.Any(id => id == r.Id)); 

另一种方法,有用的,如果该listOfIds数组很大:

HashSet<int> hash = new HashSet<int>(listofIds); 
var query = list.Where(r => hash.Contains(r.Id)); 
+2

使用实体框架(以及可能的LINQ到SQL),这实际上将转化为“SELECT * FROM Table where Id in(1,2,3,4)“,导致只有一次访问服务器。 – 2010-07-05 03:48:25

+0

@IgorZevaka - 如果要使用EF查询数据库,我更喜欢使用SortedSet(这是一种HashSet的超集)。它也是独特的,如HashSet,但也排序。然后,我将索引我要在其中运行'where'子句的Db列。在大数据中这将显着更快。 – sandiejat 2017-03-15 11:54:22

0

我会看看加入运营商:

from r in list join i in listofIds on r.Id equals i select r 

我不知道这将如何优化Contains方法,但至少它可以让编译器更好地了解您要做什么。 它也与你试图达到的目标更接近。

编辑: 的完整性扩展方法的语法(现在我已经想通了):

var results = listofIds.Join(list, i => i, r => r.Id, (i, r) => r); 
+1

我即将发布相同的答案(尽管使用扩展方法的语法,但这只是个人偏好)。是的,'join'比'Contains'更优化,因为它构造了双方内存的哈希表,而不是在'list'的每个成员的'listOfIds'中进行顺序搜索。 – 2010-07-05 03:41:54

+0

@Anthony Pegram:谢谢,我刚刚发现并删除了我的评论,对不起。 作为参考,我说我无法弄清楚语法和要求帮助 – TheEvilPenguin 2010-07-05 03:52:07