我有一个这样的集合:
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/