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();
很遗憾,你的问题还很不完整。你没有说得到的误差是多少。这是一个可行的例子。请注意,正如Mrinal Kamboj所提到的,您需要为自定义类型实现Equals
和GetHashCode
,以便将它们过滤掉:
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();