LINQ:查找List中的一个项是否出现在字符串数组中

时间:2014-10-05 16:02:32

标签: c# linq

我有一个字符串数组和另一个有对象列表的对象,属性是一个字符串。

public string[] allowedroles;

foreach (var role in allowedroles)
{
   if (user.RolesList.Exists(r => r.Name == role))
   {
      authorize = true;
      break; // if one match that break out of loop
   }
}

有没有办法只使用LINQ语句,没有foreach循环?

2 个答案:

答案 0 :(得分:3)

这听起来像你想要的:

var authorize = user.RolesList.Exists(r => allowedRoles.Contains(r.Name));

或者将角色列表转换为其名称,并查看它是否与允许的角色相交:

var authorize = user.RolesList.Select(r => r.Name).Intersect(allowedRoles).Any();

请注意,您可以使用Any代替Exists,这会阻止其专门针对List<T>

var authorize = user.RolesList.Any(r => allowedRoles.Contains(r.Name));

另请注意,即使foreach循环不在代码中,使用LINQ也不会使此代码更快更快 - 仍然存在循环,它只是在LINQ代码而不是代码中。但是,嘿,可读性仍然是一个巨大的胜利:)

答案 1 :(得分:0)

user.RolesList.Select(role => role.Name).Intersect(allowedRoles).Any()

这使用三个运算符:

  1. Select派生仅包含用户角色对象的字符串属性的序列;
  2. Intersect查找所有常用项目(即两个序列中的项目)
  3. Any检查是否至少有一个这样的公共项目。