使用 LINQ 的两个列表的交集

Intersection of two lists using LINQ

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

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

}

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

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

编辑: 评论中的人正在考虑为您的 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();        
}

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

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

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

不包含return列表的交集,只是告诉你True of False,值是否存在

希望对您有所帮助。