我有以下标志枚举:
[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中。
但是我无法完成这项工作......
有人可以帮助我吗?
谢谢你, 米格尔
答案 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));