2

我有以下标志枚举:

[Flags]
public enum RoleModels {
  Master = 1 << 0,
  Editor = 1 << 1,
  Member = 1 << 2
}

我有一个 RoleModels 变量和一个字符串列表:

var roles1 = RoleModels.Master | RoleModels.Member;

List<String> rolesStrings = new List<String> { "mAster", "Member" }

我想检查所有角色字符串是否都在角色中。

检查应该不区分大小写......在这种情况下,它将是正确的。

我试图将字符串转换为一个枚举:

var roles2 = (RoleModels)rolesStrings.Aggregate((a, b) => a | b);

然后以某种方式检查所有角色 2 是否都在角色 1 中。

但我无法完成这项工作......

有人可以帮我吗?

谢谢你,米格尔

4

4 回答 4

4

你可以这样做:

var roles1 = RoleModels.Master | RoleModels.Member;
List<String> rolesStrings = new List<String> { "mAster", "Member" }

bool hasFlag = true;
foreach (var role in rolesStrings)
{
    RoleModels enumValue;

    if (!(Enum.TryParse(role,true, out enumValue) && roles1.HasFlag(enumValue)))
    {
        hasFlag = false;
        break;
    }
}

这里是fiddle

于 2014-04-28T16:05:19.483 回答
2

Selman22 答案的 LINQ 版本:

var roles1 = RoleModels.Master | RoleModels.Member;
List<String> rolesStrings = new List<String> { "mAster", "Member" };

RoleModels enumValue;
var valid = rolesStrings.All(r => (Enum.TryParse(r, true, out enumValue) && 
                                  roles1.HasFlag(enumValue)));

请注意,如果为空,All()将返回,因为所有 0 元素都是有效的。truerolesStrings

于 2014-04-28T16:10:29.797 回答
1

我的代码版本,修改最少:

var roles1 = RoleModels.Master | RoleModels.Member;

List<String> rolesStrings = new List<String> { "mAster", "Member", "editor" };

var roles2 = rolesStrings.Select(x=>(RoleModels)Enum.Parse(typeof(RoleModels),x, true)).Aggregate((a, b) => a | b);

if ((roles1&roles2)==roles2)
{
    Console.WriteLine(String.Format("{0} (roles2) are in {1} (roles1)", roles2, roles1));
}
else
{
    Console.WriteLine(String.Format("{0} (roles2) are not in {1} (roles1)", roles2, roles1));
}

需要注意的关键事项是,对于角色 2,我曾经Enum.Parse将 sdstrings 转换为它们的枚举值。如果没有匹配的枚举,这将失败(如果您获得未经验证的数据,这可能很重要)。

然后我将它们聚合并用于(roles1&roles2)==roles2检查角色 2 中的所有内容是否都在角色 1 中。这是有效的,因为角色 2 中不在角色 1 中的任何位在&应用时都不会设置,因此在比较时它将不再匹配角色 2。

如果您需要验证输入值,您最好使用其他人建议的更详细的方法,但我提供此解决方案作为您尝试的方法最接近的“修复”,而不是向您提供完全不同的方法.

于 2014-04-28T16:14:07.780 回答
0

使用Enum.GetNames

var rolesStrings = new List<String> { "mAster", "member" };
var enums =  Enum.GetNames(typeof(RoleModels));
var result = rolesStrings.All(roleString => enums.Any(enumString => String.Equals(roleString,enumString, StringComparison.OrdinalIgnoreCase));
于 2014-04-28T16:15:41.817 回答