c# - 拆分枚举标志以在集合中创建不同项目的有效方法

标签 c# .net enums split flags

我有一个这样的集合:

IEnumerable<RecordToSend> recordsToSend;

由以下内容组成:

public class RecordToSend {
    public Guid ApplicationId { get; set; }
    public ScheduleTypes Schedule { get; set; }
}

和标记枚举:

[Flags]
public enum ScheduleTypes
{
    None = 0,
    Daily = 1,
    Weekly = 2,
    Monthly = 4
}

假设我有以下集合,它基本上是使用 Entity Framework 查询从数据库中提取出来的:

| ApplicationId | Schedule |
| ABC123        | 7        |
| DEF456        | 3        |

将枚举拆分为多个不同记录的有效方法是什么(可以使用 RecordToSend 类,或其他类型,如果有意义的话甚至是动态类型):

| ApplicationId | Schedule |
| ABC123        | 1        |
| ABC123        | 2        |
| ABC123        | 4        |
| DEF456        | 1        |
| DEF456        | 2        |

请注意 ScheduleTypes 枚举有一个 0 值标志,我想在结果中忽略它。

效率并不是最重要的问题,但我很想听听关于不同方法性能的想法。如果可以在将集合从数据库中拉出时作为 Entity Framework 查询的一部分在单个步骤中执行此拆分,那就太好了。在应用程序中,我不需要处于原始多值状态的枚举标志。

最佳答案

这应该有效。

var results = records.SelectMany(
    r => Enum.GetValues(typeof(ScheduleTypes))
             .Cast<ScheduleTypes>()
             .Where(e => e != ScheduleTypes.None && r.Schedule.HasFlag(e))
             .Select(e => 
                 new RecordToSend
                 {
                     Guid = r.Guid, 
                     Schedule = e
                 }));

基本上,对于每条记录,它循环遍历可能的枚举值(跳过 0 值)并检查 Schedule 是否具有该标志。然后使用相同的 Guid 和枚举标志创建一条新记录。 SelectMany 然后将创建的记录集合展平。

请注意,如果 records 是一个 IQueryable,您必须添加一个 AsEnumerable,因为我怀疑这是否会转换为 SQL。

关于c# - 拆分枚举标志以在集合中创建不同项目的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32484510/

相关文章:

c# - 将一个二维数组转换为两个一维数组

c# - 如何一次删除多个 XML 节点?

c# - 如何更改分配给事件的方法?

c# - 如何查找 OData edm 模型类型到 clr 类型的映射?

c# - 检测 JSON 中 null 属性和省略属性之间的差异

objective-c - 如何制作枚举案例的开关案例(快速)

c# - Windows 命名管道无法正确响应并发请求

c# - If 和 Else if block 仅运行 Else if

java - 如何实现将返回枚举的具体类型的方法签名?

java - 可以将 String 转换为枚举值吗?