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

时间:2011-08-07 12:50:01

标签: c# parsing enums ienumerable

我已经将几个字符串解析为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>困住了。有什么建议吗?

2 个答案:

答案 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);
相关问题