检查Flags Enum是否包含所有字符串

时间:2014-04-28 15:57:53

标签: c# enums bitflags

我有以下标志枚举:

[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" }

我想检查所有rolesStrings是否都在角色中。

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

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

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

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

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

有人可以帮助我吗?

谢谢你, 米格尔

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

一个LINQ-ified版本的Selman22的答案:

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()为空,true将返回rolesStrings,因为所有0个元素都有效。

答案 2 :(得分: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将sdtrings转换为其枚举值。如果没有匹配的枚举,这将失败(如果您获得未经验证的数据,这可能很重要)。

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

如果您需要对输入值进行验证,最好使用更详细的方法,例如其他建议的方法,但我提供此解决方案作为最接近的&#34;修复&#34;对你尝试的方法而不是向你展示一种完全不同的方法。

答案 3 :(得分: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));