【问题标题】:Lambda - user id in list existing in a listLambda - 列表中存在的列表中的用户 ID
【发布时间】:2018-06-21 08:09:51
【问题描述】:

list1 包含用户 ID 和用户名

list2 包含用户 ID

需要显示list1,其userid包含在list2中。

string userids = "user1,user2,user3";
var list2 = userids.Split(',').Select(userid => userid.Trim()).ToList();

list1 = list1.Any(x => x.UserID)... //Got stuck here

【问题讨论】:

    标签: c# asp.net linq lambda


    【解决方案1】:

    最好使用HashSet<T> 进行搜索:

    string userids = "user1,user2,user3";
    var userIdSet = new HashSet<string>(userids.Split(',').Select(userid => userid.Trim()));
    
    list1 = list1.Where(x => userIdSet.Contains(x.UserID)).ToList();
    

    【讨论】:

    • 你可以很好地链接方法来创建HashSet: userids.Split(',').ToHashSet()。
    • @Fabio:不过需要 .NET Framework 4.7.2。但不知道,不错
    【解决方案2】:

    另一种方法是Enumerable.Join,如果列表很大,效率会更高:

    var containedUsers = from x1 in list1
                         join x2 in list2 on x1.UserId equals x2
                         select x1;
    list1 = containedUsers.ToList();
    

    我假设 list2 中的用户 ID 是唯一的(否则使用 Distinct)。如果没有,加入它们可能会导致 list1 中的重复项。

    【讨论】:

    • 我认为使用HashSet 的值进行搜索会更有效率。
    • @Fabio: 不一定,因为你必须从string[] 填写这个HashSet 才能使用它。此时此查询可能已经完成。在大多数情况下,无论如何都无关紧要,OP 应该使用他认为最易读的内容。
    • 同意,不计算HashSet构建操作,谢谢
    • 需要挖掘更多:Join 的工作方式几乎相同,它将循环一个集合并创建Lookup,并在循环另一个集合时组合匹配项。所以Join 似乎是更好的方法,因为它包含了“实现细节”:)
    【解决方案3】:

    它很容易卡住所以你需要检查list2是否包含你选择的项目。

    found = list1.Where( x => list2.contains(x.UserID));
    

    【讨论】:

      【解决方案4】:

      方法Any返回bool,它

      确定序列中的任何元素是否满足条件

      返回值

      输入:System.Boolean

      true 如果源序列中的任何元素通过指定谓词中的测试;否则,false。

      方法Where

      根据谓词过滤一系列值。

      因此您可以在Where 中使用Any 来过滤仅包含在list2 中的结果。

      list1 = list1.Where(l1 => list2.Any(l2 => l2 == l1.UserID)).ToList();
      

      参考:Enumerable.Any(Of TSource) Method、Enumerable.Where(Of TSource) Method

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-19
        • 1970-01-01
        • 2013-04-03
        • 1970-01-01
        • 2018-04-09
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        相关资源
        最近更新 更多