在枚举值上使用Where

时间:2016-05-12 19:32:55

标签: c# linq enums

我已使用enum属性定义了[Flag]

给定一个整数值,我想打印整数值中设置的所有enum值。

这是我到目前为止所拥有的。

string s = string.Join(", ", Enum.GetValues(typeof(MyEnumType)).OfType<Enum>()
                                 .Where(x => (MyIntValue & (int)x) != 0));

但是最后一行中int的类型转换给了我以下错误。

  

无法转换类型&#39; System.Enum&#39;到&#39; int&#39;

我希望Microsoft能够替换所有返回Array的框架代码,转而支持支持LINQ的类型。

但有一种简单的方法吗?

3 个答案:

答案 0 :(得分:3)

转换为MyEnumType而不是通用Enum应解决问题:

string s = string.Join(
    ", ",
    Enum.GetValues(typeof(MyEnumType))
        .OfType<MyEnumType>()
        .Where(x => (MyIntValue & (int)x) != 0));

您确实应该使用Cast而不是OfType,因为您确定这些项目的类型为MyEnumType

答案 1 :(得分:2)

太多的LINQ思维方式,所以有时我们会忘记它们来自哪里:)从第一个.NET版本开始,Enum.GetValues(typeof(MyEnum))实际上返回MyEnum[],所以你需要的不是{{ 1}},也不是OfType,而是简单的C#Cast

cast

因为string s = string.Join(", ", ((MyEnum[])Enum.GetValues(typeof(MyEnumType))) .Where(x => (MyIntValue & (int)x) != 0)); 加上相同类型的演员是非常讨厌的,很长一段时间我在口袋里都有这个小帮手:

typeof

允许我使用更简洁的

public static class EnumInfo
{
    public static T[] GetValues<T>() where T : struct // I (and not only) wish I could say where T : enum
    {
        return (T[])Enum.GetValues(typeof(T));
    }
}

答案 2 :(得分:0)

您可以编写自己的GetValues方法,使用泛型来获得所需内容:

public static class EnumUtil
{
    public static IEnumerable<T> GetValues<T>()
    {
        foreach(T enumVal in Enum.GetValues(typeof(T)))
        {
            yield return enumVal;
        }
    }
} 

然后使用它:

var s = string.Join(", ", EnumUtil.GetValues<TestEnum>()
    .Where(x => (myIntValue & (int)x) != 0));