【问题标题】:Intersection of two lists using LINQ使用 LINQ 的两个列表的交集
【发布时间】:2015-06-19 13:57:43
【问题描述】:

我有一个名为 admin 的用户,他有一个公司列表。我想返回拥有一个或多个相同公司的用户列表。我正在使用此查询使用 Linq,但我不确定它为什么不起作用。我不太明白 .Any() 的作用,但如果我不包含它,程序就会出现语法错误。这是我的尝试:

public List<User> GetUsers(User admin)
{
    return Users.Where(user=>user.Companys.Intersect(admin.Companys)).Any()).ToList();

}

【问题讨论】:

  • 你尝试的结果是什么?
  • 一个空列表。我完全不确定如何调试该语句。
  • 列表Companys是什么类型的?如果是List&lt;Company&gt; Company 需要覆盖EqualsGetHashCode 或者实现IEquatable&lt;Company&gt;。您还可以创建一个自定义 IEqualityComparer&lt;Company&gt;,您可以在 Intersect 的重载中使用它。
  • 既然你已经添加了database标签,我想它可以帮助你:msdn.microsoft.com/en-us/library/bb301437(v=vs.110).aspx
  • @TimSchmelter - _ 需要覆盖 Equals_ 这在很大程度上取决于底层系统。对于 Linq-to-Objects,正常的引用等于应该足够了。

标签: c# database linq list intersect


【解决方案1】:

编辑: cmets 中的人正在考虑为您的 Company 对象覆盖 equals,它们是正确的,但是我们也许可以做一些更简单的事情。您需要覆盖 equals 的原因是因为 .Net 不知道如何在您创建的对象中找到相等性。所以你需要编程如何让它知道。然而,它确实知道如何在 ID 中查找相等性。

编辑 2: Intersect Any 是要走的路,因为您想将列表与列表进行比较

public List<User> GetUsers(User admin)
{
    var adminCompanyIDs = admin.Companys.Select(c => c.ID);
    return Users.Where(user=>user.Companys.Select(c => c.ID).Intersect(adminCompanyIDs).Any()).ToList();        
}

所以 Contains 将搜索列表以查看列表中是否有任何单个值。因为它只搜索单个值,所以它不适用于此。

Intersect 将返回两个列表的交集。例如 [1,2,3] [2,3,4] 将给出 [2,3]。

函数评估需要布尔值。给我列表中给定函数返回 true 的值。因此,当您回馈 [2,3] 时,它会抱怨。任何说列表中有任何结果。所以 [2,3].Any() 返回 true,满足 Where。

包含不返回列表的交集,只是告诉你真假,值是否存在

希望对您有所帮助。

【讨论】:

  • 它给了我一个关于参数数量错误的语法错误
  • 这绝对有帮助,但我仍然收到关于“不接受 1 个参数”的错误
  • 似乎 Intersect > Any 是检查列表的任何值是否包含在第一个列表中的最佳方法。抱歉,我在写这个答案时没有打开 VS。我希望额外的信息有所帮助!
  • 包含检查一个项,而不是项的集合。
【解决方案2】:

尝试在唯一属性而不是对象上相交

return Users.Where(user=>user.Companys.Select(c => c.ID).Intersect(admin.Companys.Select(a => a.id)).Any())
        .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多