枚举列表中任意字符串数组的 Linq 版本

Linq version of string array any in enum list

目前我有:

public enum ApplicationRoles
{
        Undefined = 0,
        Basic = 1,
        Admin = 2
}

// within a method:

bool? isAuthorized = null;
string[] allowedRoles = { "Admin" };
List<ApplicationRoles> userRoles = new List<ApplicationRoles>();

userRoles.Add(ApplicationRoles.Admin); 

foreach (string role in allowedRoles)
{
   foreach (ApplicationRoles appRole in userRoles)
   {
     if (appRole != ApplicationRoles.Undefined)
         isAuthorized = role.ToLower() == appRole.ToString().ToLower();
   }

   if ((bool)isAuthorized)
     break;
}

isAuthorized 在此示例中 return 为真。

如何将其转换为 Linq 语句?

您不应将任何值存储为硬编码字符串;毕竟,这就是枚举的用途。

var allowedRoles = new HashSet<ApplicationRoles> { ApplicationRoles.Admin };
bool isAuthorized = userRoles.Any(r => allowedRoles.Contains(r));

这种方法也适用于数组。

var allowedRoles = new[] { ApplicationRoles.Admin };
var userRoles = new[] { ApplicationRoles.Basic };
bool isAuthorized = userRoles.Any(r => allowedRoles.Contains(r));

您正在寻找Any方法:

allowedRoles
.Any(role => user.Roles.Any(r => r != ApplicationRoles.Undefined &&
                                 role.ToLower() == r.ToString().ToLower()));

如果您只想检查一个角色,则不需要 allowedRoles 数组:

user.Roles.Any(r => r.ToLower() == "admin");

怎么样

var allowedRoles = Enum.GetValues(typeof(ApplicationRoles))
    .Cast<ApplicationRoles>()
    .Except(ApplicationRoles.Undefinied); // allow all except undefined

bool isAuthorized = userRoles.Any(r => allowedRoles.Contains(r));

这样你就不需要搞乱任何字符串比较。