C# 如何使用Linq检查对象列表属性是否允许来自其他列表的值
我有一个班上的人,在这个班上我有一些属性。这些属性之一是字符串角色。 用户可以在我应该解析的xml文件中输入角色。 我有一个允许的角色列表,其中允许的角色是硬编码的。我想检查Role属性是否正确,并将其与allowedRoles列表进行比较。 我想使用linq过滤掉不允许的角色C# 如何使用Linq检查对象列表属性是否允许来自其他列表的值,c#,linq,C#,Linq,我有一个班上的人,在这个班上我有一些属性。这些属性之一是字符串角色。 用户可以在我应该解析的xml文件中输入角色。 我有一个允许的角色列表,其中允许的角色是硬编码的。我想检查Role属性是否正确,并将其与allowedRoles列表进行比较。 我想使用linq过滤掉不允许的角色 public class Person { Public string Name {get; set;} Public string Role {get; set;} } 我有一个允许角色的列表 var
public class Person
{
Public string Name {get; set;}
Public string Role {get; set;}
}
我有一个允许角色的列表
var allowedRoles = new List<string>{"Developer","Admin","Recruiter"};
var allowedRoles=新列表{“开发人员”、“管理员”、“招聘人员”};
在后面的一个阶段,当我解析xml时。我得到一个需要根据AllowedRoles列表验证role属性的人员列表。我不想使用循环。我更喜欢使用linq表达式过滤掉未验证的角色,在这里,Im留下了一个拥有允许角色的人员列表。
因此,我有一份人员名单:
var persons = new List<Person>();
var persons=新列表();
如何使用我的AllowedRoles列表从人员中筛选出不允许的角色?实现这一点的一种方法是使用
,其中
与包含相结合,例如:
var filteredPeople = persons.Where(p => allowedRoles.Contains(p.Role));
您可以简单地执行以下操作:
var allowedPersons = persons.Where(p => allowedRoles.Any(r => r == p.Role));
您可以将LinqWhere
扩展方法与包含列表的方法一起使用,如下所示:
static void Test()
{
var persons = new List<Person>
{
new Person { Name = "1", Role = "Admin" },
new Person { Name = "2", Role = "Customer" },
new Person { Name = "3", Role = "Recruiter" },
new Person { Name = "4", Role = "User" },
};
var allowedRoles = new List<string> { "Developer", "Admin", "Recruiter" };
var personsAllowed = persons.Where(person => allowedRoles.Contains(person.Role));
foreach ( var person in personsAllowed )
Console.WriteLine(person.Name);
}
contains方法假定字符串完全匹配,大小写相同
允许的输出
不允许的输出
使用扩展方法,您可以以更具表现力的方式编写它:
var filteredPeople = persons.Where(p => p.Role.IsIn(allowedRoles));
以及您的扩展方法:
public static class ExtensionMethods
{
public static bool IsIn<T>(this T item, List<T> list)
{
return list.Contains(item);
}
}
公共静态类扩展方法
{
公共静态布尔IsIn(此T项,列表)
{
返回列表。包含(项目);
}
}
这读起来几乎像真正的英语:“角色在允许的角色中”。注意,Linq只是在封面下做循环。此外,我还建议将allowedRoles
设置为哈希集
,但如果它不超过3,那也没什么大不了的。是的,我知道它是在幕后循环。不过,我正在尝试学习使用linq。谢谢你的反馈
2
4
var filteredPeople = persons.Where(p => p.Role.IsIn(allowedRoles));
public static class ExtensionMethods
{
public static bool IsIn<T>(this T item, List<T> list)
{
return list.Contains(item);
}
}