我有一个字符串数组和另一个有对象列表的对象,属性是一个字符串。
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循环?
答案 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()
这使用三个运算符:
Select
派生仅包含用户角色对象的字符串属性的序列; Intersect
查找所有常用项目(即两个序列中的项目)Any
检查是否至少有一个这样的公共项目。