lambda表达式存在于列表中

时间:2010-07-05 03:33:26

标签: c# linq lambda

如果我想针对特定ID过滤对象列表,我可以这样做:

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

如果我有一个要比较的ID列表,而不是单个idToCompare怎么办?

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

int[] listofIds = GetListofIds();

list.Where(r => r.Id "in listofIds");   

4 个答案:

答案 0 :(得分:54)

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

最好将要查找的ID存储到适合搜索的容器中,例如Set。

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

答案 1 :(得分:21)

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 :(得分:6)

您可以使用Contains()扩展方法:

list.Where(r => listofIds.Contains(r.Id))

答案 3 :(得分:1)

我会看一下Join运算符:

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