繁体   English   中英

如何使用 Linq 检查对象列表属性是否允许来自另一个列表的值

[英]How to use Linq to check a list of objects property have allowed values from another list

我有一个 class 人,在这个 class 中我有一些属性。 这些属性之一是字符串角色。 用户可以在我应该解析的 xml 文件中输入角色。 我有一个 allowedRoles 列表,其中允许的角色是硬编码的。 我想检查 Role 属性并将其与 allowedRoles 列表进行比较。 我想使用 linq 过滤掉不允许的角色。

public class Person
{
   Public string Name {get; set;}

   Public string Role {get; set;}
}

我有一个包含允许角色的列表

var allowedRoles = new List<string>{"Developer","Admin","Recruiter"};

在稍后阶段,当我解析 xml 时。 我得到了一个 Person 列表,我需要根据我的 AllowedRoles 列表验证角色属性。 我不想使用循环。 我更喜欢使用 linq 表达式来过滤掉无效角色,其中我留下了具有允许角色的人员列表。 所以我有一个人员列表:

var persons = new List<Person>();

如何使用我的 AllowedRoles 列表从 Persons 中过滤掉不允许的角色?

实现此目的的一种方法是将WhereContains结合使用,例如:

var filteredPeople = persons.Where(p => allowedRoles.Contains(p.Role));

你可以简单地做:

var allowedPersons = persons.Where(p => allowedRoles.Any(r => r == p.Role));

您可以使用Where扩展方法与List<string>Contains方法,如下所示:

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);
}

要获得不允许,只需使用 not 运算符:

var personsUnallowed = persons.Where(person => !allowedRoles.Contains(person.Role));

contains 方法假定字符串完全匹配并且大小写相同。

Output 允许

1
3

Output 不允许

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);
  }
 }

这读起来几乎像真正的英语:“角色在允许的角色中”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM