gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:24 24 4
gpt4 key购买 nike

我有一个这样的集合:

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/

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