使用LINQ交叉两个列表

时间:2015-06-19 13:57:44

标签: c# database linq list intersect

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

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

}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

编辑: 评论中的人正在考虑覆盖公司对象的等于它们并且它们是正确的但是我们可以更容易地做一些事情。你需要覆盖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将搜索列表以查看列表中是否有任何单个值。因为它只搜索单个值,所以它不会为此工作。

相交将返回两个列表的交叉点。例如[1,2,3] [2,3,4]会给出[2,3]。

其中需要一个布尔值来进行功能评估。给我列表中的值,给定的函数返回true。所以,当你回馈[2,3]时,它会抱怨。任何说明在列表中有任何结果。所以[2,3] .Any()返回true,满足Where。

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

希望有所帮助。