如何在C#中将IEnumerable <Enum>转换为Enum?

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)