Skip to main content
 首页 » 编程设计

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

2024年05月29日31rubylouvre

我有一个这样的集合:

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。