使用LINQ选择枚举中的所有标记值

时间:2017-12-15 11:03:35

标签: c# linq enums enum-flags

我有一组标记的枚举,如下所示:

[Flags]
enum EnumThing
{
    A = 1,
    B = 2,
    C = 4,
    D = 8
}

我想使用LINQ选择集合中的所有标志。让我们说这个集合是这样的:

EnumThing ab = EnumThing.A | EnumThing.B;
EnumThing ad = EnumTHing.A | EnumThing.D;    
var enumList = new List<EnumThing> { ab, ad };

在位中它看起来像这样:

0011
1001

这样的结果如下:

1011

通过以下代码可以在普通C#中实现预期的结果:

EnumThing wishedOutcome = ab | ad;

或SQL中的

select 3 | 9

但是如何使用Linq将enumList中的所有选定标记选择为新的EnumThing

2 个答案:

答案 0 :(得分:4)

您可以使用LINQ Aggregate功能:

var desiredOutcome = enumList.Aggregate((x, y) => x | y);

请注意,如果list为空 - 这将引发异常,因此在执行此操作之前检查list是否为空。

var desiredOutcome = enumList.Count > 0 ? 
    enumList.Aggregate((x, y) => x | y) : 
    EnumThing.Default; // some default value, if possible

答案 1 :(得分:4)

一个简单的linq解决方案就是:

EnumThing ab = EnumThing.A | EnumThing.B;
EnumThing ad = EnumThing.A | EnumThing.D;
var enumList = new List<EnumThing> { ab, ad };

var combined = enumList.Aggregate((result, flag) => result | flag);