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

C# 使用LINQ选择枚举中所有标记的值,c#,linq,enums,enum-flags,C#,Linq,Enums,Enum Flags,我有一组标记的枚举,如下所示: [Flags] enum EnumThing { A = 1, B = 2, C = 4, D = 8 } 0011 1001 1011 我想使用LINQ选择集合中的所有标志。假设集合是这样的: EnumThing ab = EnumThing.A | EnumThing.B; EnumThing ad = EnumTHing.A | EnumThing.D; var enumList = new List<En

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

[Flags]
enum EnumThing
{
    A = 1,
    B = 2,
    C = 4,
    D = 8
}
0011
1001
1011
我想使用LINQ选择集合中的所有标志。假设集合是这样的:

EnumThing ab = EnumThing.A | EnumThing.B;
EnumThing ad = EnumTHing.A | EnumThing.D;    
var enumList = new List<EnumThing> { ab, ad };
期望的结果是这样的:

[Flags]
enum EnumThing
{
    A = 1,
    B = 2,
    C = 4,
    D = 8
}
0011
1001
1011
通过以下代码,可在普通C#中实现预期结果:

EnumThing wishedOutcome = ab | ad;
或在SQL中由

select 3 | 9

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

您可以使用Linq
Aggregate
函数:

var desiredOutcome = enumList.Aggregate((x, y) => x | y);
请注意,若列表为空,则会引发异常,所以在执行此操作之前,请检查列表是否为空

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

一个简单的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);
EnumThing ab=EnumThing.A | EnumThing.B;
EnumThing ad=EnumThing.A | EnumThing.D;
var enumList=新列表{ab,ad};
var combined=enumList.Aggregate((结果,标志)=>result |标志);

EnumThing ab=EnumThing.A*|*EnumThing.B