C# 列表中存在的lambda表达式

C# 列表中存在的lambda表达式,c#,linq,lambda,C#,Linq,Lambda,如果要根据特定id筛选对象列表,可以执行以下操作: list.Where(r => r.Id == idToCompare); 如果我没有一个idToCompare,而是有一个要比较的ID列表,该怎么办 与预定义列表进行比较的语法是什么?比如: int[] listofIds = GetListofIds(); list.Where(r => r.Id "in listofIds"); 如果listOfIds是一个列表,这将起作用,但是,list.Contains(

如果要根据特定id筛选对象列表,可以执行以下操作:

list.Where(r => r.Id == idToCompare);   
如果我没有一个
idToCompare
,而是有一个要比较的ID列表,该怎么办

与预定义列表进行比较的语法是什么?比如:

int[] listofIds = GetListofIds();

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

如果
listOfIds
是一个列表,这将起作用,但是,list.Contains()是一个线性搜索,因此效率不高

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

List<int> listOfIds = new List(GetListOfIds());
lists.Where(r=>listOfIds.Contains(r.Id));
List listOfIds=新列表(GetListOfIds());
其中(r=>listOfIds.Contains(r.Id));
您可以使用Contains()扩展方法:

list.Where(r => listofIds.Contains(r.Id))
如果listOfIds数组较大,另一种方法很有用:

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

我将查看Join操作符:

from r in list join i in listofIds on r.Id equals i select r
我不确定这将如何在Contains方法上进行优化,但至少它让编译器更好地了解您要做的事情。 它在语义上也更接近你想要达到的目标

编辑: 完整性扩展方法语法(现在我已经弄明白了):


我正要发布相同的答案(虽然使用扩展方法语法,但这只是个人偏好)。是的,
join
Contains
更优化,因为它在内存中构建了一个两边键的哈希表,而不是在
listOfIds
中对
list
的每个成员进行顺序搜索@Anthony Pegram:谢谢,我刚刚找到并删除了我的评论,对不起。作为参考,我说我无法理解语法,并要求提供实体框架(可能还有LINQ To SQL)使用的帮助,这实际上将转换为“从Id位于(1,2,3,4)中的表中选择*”,导致只需要一次到服务器。@IgorZevaka-如果它要使用EF查询数据库,我更喜欢使用SortedSet(这有点像HashSet的超集)。它也是唯一的,就像HashSet一样,但也是经过排序的。然后我将索引我的Db列,我将在其上运行“where”子句。在大数据中,这将大大加快速度。
from r in list join i in listofIds on r.Id equals i select r
var results = listofIds.Join(list, i => i, r => r.Id, (i, r) => r);