LINQ检查列表是否< >是另一个列表的子集

本文关键字:列表 另一个 子集 检查 是否 LINQ | 更新日期: 2023-09-27 18:18:23

我有两个列表的用户类即UsersExisting, userstouupdate。类结构如下:

public class Users
{
    public string Name{get;set}
    public Roles[] AvailableRoles{get;set}
}
class Roles
{
    public int Serial{get;set}
    public string Name{get;set}
    public bool IsActive{get;set}
}

我必须检查UsersToUpdate是否已经有UsersExisting的所有角色详细信息。

。这是列表

UsersExisting.AvailableRoles={{1,"admin",true},{2,"hr",false},{3,"it",true}};
UsersToUpdate.AvailableRoles={{1,"admin",true},{2,"hr",false},{3,"it",true},{4,"finance",false}};

如何在LINQ中做到这一点

我是这样做的。

bool isUsersUpdated = !UsersExisting.AvailableRoles
.Except(UsersToUpdate.AvailableRoles).Any();

LINQ检查列表是否< >是另一个列表的子集

很遗憾,你的问题还很不完整。你没有说得到的误差是多少。这是一个可行的例子。请注意,正如Mrinal Kamboj所提到的,您需要为自定义类型实现EqualsGetHashCode,以便将它们过滤掉:

List<Roles> existing = new List<Roles>
{
    new Roles(1, "admin", true),
    new Roles(2, "hr", false),
    new Roles(3, "it", true)
};
List<Roles> available = new List<Roles>
{
    new Roles(1, "admin", true),
    new Roles(2, "hr", false),
    new Roles(3, "it", true),
    new Roles(4, "finance", false)
};
bool isUsersUpdated = !existing.Except(available).Any();
Console.WriteLine(isUsersUpdated);

// modified Roles class
class Roles
{
    public int Serial { get; set; }
    public string Name { get; set; }
    public bool IsActive { get; set; }
    public Roles(int serial, string name, bool isActive)
    {
        Serial = serial;
        Name = name;
        IsActive = isActive;
    }
    public override bool Equals(object obj)
    {
        Roles other = obj as Roles;
        if (other == null)
            return false;
        return Serial == other.Serial && Name == other.Name && IsActive == other.IsActive;
    }
    public override int GetHashCode()
    {
        return new { Serial, Name, IsActive }.GetHashCode();
    }
}

我认为您在这里寻找的扩展方法是相交-在您的情况下,您希望得到没有结果,以表明它不存在于超级列表

if(!UsersToUpdate.AvailableRoles.Intersect(UsersExisting.AvailableRoles).Any())
{
      //your code here    
}

由于您的列表是Role对象的列表,您可能不想使用Contains(或Except),因为它只会告诉您是否那些特定的对象实例在列表中-换句话说,它比较对象引用,而不是对象内容。(除非,根据@poke的答案,你改变了类中"equals"的含义)。

然而,我认为角色的Serial属性是一个唯一的标识符,您可以将其用于此目的—在这种情况下,您可以这样做:

bool isUsersUpdated = !UsersExisting.AvailableRoles.Select(r => r.Serial)
                      .Except(UsersToUpdate.AvailableRoles.Select(r => r.Serial))
                      .Any();