【问题标题】:lambda expression for exists within list列表中存在的 lambda 表达式
【发布时间】:2010-07-05 03:33:26
【问题描述】:

如果我想根据特定 id 过滤对象列表,我可以这样做:

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

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

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

int[] listofIds = GetListofIds();

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

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:
      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));
      

      【讨论】:

      • 与实体框架(可能还有 LINQ-To-SQL)一起使用,这实际上将转换为“SELECT * FROM Table where Id in (1,2,3,4)”,结果只有一个访问服务器。
      • @IgorZevaka - 如果要使用 EF 查询数据库,我会更喜欢使用 SortedSet(它是 HashSet 的超集)。它也是唯一的,就像 HashSet 一样,但也是排序的。然后,我将索引我将在其上运行“where”子句的 Db 列。这在大数据中会明显更快。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我会看看 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);
        

        【讨论】:

        • 我正要发布相同的答案(虽然使用扩展方法语法,但这只是个人喜好)。是的,joinContains 更优化,因为它为两边的键构造了一个内存中的哈希表,而不是在listOfIds 中为list 的每个成员进行顺序搜索。
        • @Anthony Pegram:谢谢,我刚刚发现并删除了我的评论,抱歉。作为参考,我说我无法弄清楚语法并寻求帮助
        猜你喜欢
        • 1970-01-01
        • 2019-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多