waj*_*waj 5 c# ienumerable enums parsing
我已经将几个字符串解析为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);
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用Select方法转换为我的Enum类型,但后来我坚持了下来IEnumerable<MyEnum>.有什么建议?
Jon*_*eet 12
那么,从IEnumerable<MyEnum>你可以使用:
MyEnum result = parsed.Aggregate((current, next) => current | next);
Run Code Online (Sandbox Code Playgroud)
或者为了容纳一个空序列:
MyEnum result = parsed.Aggregate(MyEnum.None, (current, next) => current | next);
Run Code Online (Sandbox Code Playgroud)
它基本上和你已经拥有的一样,不可否认......
整体而言,代码将是:
MyEnum result = flags.Select(x => (MyEnum) Enum.Parse(typeof(MyEnum), x))
.Aggregate(MyEnum.None, (current, next) => current | next);
Run Code Online (Sandbox Code Playgroud)
(Aggregate根据Guffa的回答,你可以在一个电话中执行它,但我个人认为,为了清楚起见,我会将两者分开.虽然这是个人偏好.)
请注意,我的Unconstrained Melody项目使枚举处理更加愉快,您也可以使用Enum.TryParse.NET 4中的通用方法.
例如,使用Unconstrained Melody,您可以使用:
MyEnum result = flags.Select(x => Enums.ParseName<MyEnum>(x))
.Aggregate(MyEnum.None, (current, next) => current | next);
Run Code Online (Sandbox Code Playgroud)