簡體   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