我已经将几个字符串解析为Enum标志,但是看不到将它们合并到单个Enum位域的巧妙方法。
我正在使用的方法循环遍历字符串值,然后是| = Enum对象的转换值,如下所示:
[Flags]
public enum MyEnum { None = 0, First = 1, Second = 2, Third = 4 }
...
string[] flags = { "First", "Third" };
MyEnum e = MyEnum.None;
foreach (string flag in flags)
e |= (MyEnum)Enum.Parse(typeof(MyEnum), flag, true);
我尝试使用Select方法转换为我的枚举类型,但后来我被IEnumerable<MyEnum>
困住了。有什么建议吗?
答案 0 :(得分:12)
嗯,从IEnumerable<MyEnum>
您可以使用:
MyEnum result = parsed.Aggregate((current, next) => current | next);
或为了容纳空序列:
MyEnum result = parsed.Aggregate(MyEnum.None, (current, next) => current | next);
这与你已经拥有的基本相同,不可否认......
总的来说,代码是:
MyEnum result = flags.Select(x => (MyEnum) Enum.Parse(typeof(MyEnum), x))
.Aggregate(MyEnum.None, (current, next) => current | next);
(根据Guffa的回答,您可以在一次Aggregate
电话中执行此操作,但我个人认为,为了清楚起见,我会将两者分开。但这是个人偏好。)
请注意,我的Unconstrained Melody项目使枚举处理更加愉快,您还可以在.NET 4中使用通用Enum.TryParse
方法。
例如,使用Unconstrained Melody可以使用:
MyEnum result = flags.Select(x => Enums.ParseName<MyEnum>(x))
.Aggregate(MyEnum.None, (current, next) => current | next);
答案 1 :(得分:3)
您可以使用Aggregate
方法将标记放在一起:
MyEnum e = flags
.Select(s => (MyEnum)Enum.Parse(typeof(MyEnum), s, true))
.Aggregate(MyEnum.None, (f, n) => f | n);