如果我想针对特定ID过滤对象列表,我可以这样做:
list.Where(r => r.Id == idToCompare);
如果我有一个要比较的ID列表,而不是单个idToCompare
怎么办?
与预定义列表进行比较的语法是什么?类似的东西:
int[] listofIds = GetListofIds();
list.Where(r => r.Id "in listofIds");
答案 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);