Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Linq检查对象列表属性是否允许来自其他列表的值_C#_Linq - Fatal编程技术网

C# 如何使用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

我有一个班上的人,在这个班上我有一些属性。这些属性之一是字符串角色。 用户可以在我应该解析的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"};
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));

您可以将Linq
Where
扩展方法与
包含
列表的
方法一起使用,如下所示:

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