gpt4 book ai didi

c# - GroupBy 使用 [Flag] 枚举按单个枚举分组

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:14 27 4
gpt4 key购买 nike

假设我有

[Flags]
public enum MyEnum
{
ValueZero = 1,
ValueOne = 2,
ValueTwo = 4
}

public class MyClass
{
public string Property { get; set; }
public MyEnum EnumValue { get; set; }
}

我希望能够使用 GroupByList<MyClass> 上按枚举分组而不考虑它是一个标志枚举。

当我使用 GroupBy 时(问题末尾的示例),分组是用这样的聚合枚举进行的

//Grouping             Values
ValueZero | ValueOne : myClass1, myClass2
ValueOne | ValueTwo : myClass3, myClass4

我希望得到以下结果(使用 GroupBy 方法,因为它比使用 Where 3 次性能更高)

//Grouping  Values
ValueZero : myClass1, myClass2
ValueOne : myClass1, myClass2, myClass3, myClass4
ValueTwo : myClass4

我认为使用它会起作用:

var list = new List<MyClass>();
var groupedList = list.GroupBy(c => c.EnumValue);

最佳答案

首先将每个枚举值拆分为单独的标志(如 shown here ),然后展平结果和分组。

它应该是这样的:

var groupedList = list
.Select(c => new { Flags=GetFlags(c.EnumValue), Item=c }) // split flags
.SelectMany(c => c.Flags.Select(x => new { Flag=x, Item=c.Item })) // flatten
.GroupBy(c => c.Flag, i => i.Item); // group

其中 GetFlags 是获取单个枚举标志的方法,如链接答案中的方法:

static IEnumerable<MyEnum> GetFlags(MyEnum input)
{
return Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>()
.Where(f => input.HasFlag(f));
}

关于c# - GroupBy 使用 [Flag] 枚举按单个枚举分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25293212/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com