Как использовать Linq для проверки списка свойств объектов, имеющих разрешенные значения из другого списка - PullRequest
0 голосов
/ 09 июля 2020

У меня есть класс Person, в этом классе у меня есть некоторые свойства. Одно из этих свойств - строковая роль. пользователь может ввести роль в файл xml, который я должен проанализировать. У меня есть список разрешенных ролей, в котором разрешенные роли жестко запрограммированы. Я хочу проверить, есть ли свойство Role, и сравнить его со списком allowedRoles. Я хочу использовать linq для фильтрации запрещенных ролей.

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

   Public string Role {get; set;}
}

У меня есть список разрешенных ролей

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

На более позднем этапе i, когда я проанализировал xml. Я получаю список лиц, для которых мне нужно проверить свойство роли по моему списку AllowedRoles. Я не хочу использовать al oop. Я бы предпочел использовать выражение linq, чтобы отфильтровать недопустимые роли, в которых я оставил список лиц, у которых есть разрешенные роли. Итак, у меня есть список лиц:

var persons = new List<Person>();

Как мне использовать мой список AllowedRoles, чтобы отфильтровать недопустимые роли от лиц?

Ответы [ 4 ]

5 голосов
/ 09 июля 2020

Один из способов добиться этого - использовать Where в сочетании с Contains, например:

var filteredPeople = persons.Where(p => allowedRoles.Contains(p.Role));
1 голос
/ 09 июля 2020

С помощью метода расширения вы можете написать его более выразительно:

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

Это читается почти как настоящий английский sh : "где роль находится в разрешенных ролях".

0 голосов
/ 09 июля 2020

Вы можете использовать метод расширения Linq Where с методом Contains для List<string>, например:

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 предполагает, что строки идентичны и имеют одинаковый регистр.

Разрешенный вывод

1
3

Запрещенный вывод

2
4
0 голосов
/ 09 июля 2020

Вы можете просто сделать:

var allowedPersons = persons.Where(p => allowedRoles.Any(r => r == p.Role));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...