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

时间:2015-09-09 16:11:29

标签: 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
}

所以,让我们说我有以下集合,它基本上是使用实体框架查询从数据库中取出的:

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

将枚举分成多个不同记录的有效方法是什么,导致这种情况(可以使用RecordToSend类或其他类型,如果有意义则使用动态):

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

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

效率并不是最令人担忧的,尽管我很想知道不同方法的表现。如果我可以在一个步骤中执行此拆分作为实体框架查询的一部分,因为我将集合从数据库中拉出来,那将是很好的。在应用程序中,我不需要在其原始的多值状态下使用枚举标志。

2 个答案:

答案 0 :(得分:4)

这应该有用。

/**
 * @Entity
 * @Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"store_id", "user_id"})})
 */
class ECommerceProduct
{
}

基本上,对于每个记录,它循环遍历可能的枚举值(跳过0值)并检查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 })); 是否具有该标志。然后创建一个具有相同Schedule和枚举标志的新记录。 Guid然后展平已创建的记录集合。

请注意,如果SelectManyrecords,您必须添加IQueryable,因为我怀疑这会转换为SQL。

答案 1 :(得分:-1)

尝试linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            IEnumerable<RecordToSend> recordsToSend = new List<RecordToSend>() {
                new RecordToSend() { ApplicationId = System.Guid.Parse("00000001-0001-0001-0001-000000000123"), Schedule = ScheduleTypes.Daily},
                new RecordToSend() { ApplicationId = System.Guid.Parse("00000001-0001-0001-0001-000000000123"), Schedule = ScheduleTypes.Weekly},
                new RecordToSend() { ApplicationId = System.Guid.Parse("00000001-0001-0001-0001-000000000123"), Schedule = ScheduleTypes.Monthly},
                new RecordToSend() { ApplicationId = System.Guid.Parse("00000001-0001-0001-0001-000000000456"), Schedule = ScheduleTypes.Daily},
                new RecordToSend() { ApplicationId = System.Guid.Parse("00000001-0001-0001-0001-000000000456"), Schedule = ScheduleTypes.Weekly}
            };

            var results = recordsToSend.AsEnumerable()
                .GroupBy(x => x.ApplicationId)
                .Select(x => new {
                    ApplicationID = x.Key, 
                    Schedule = x.Select(y => (int)y.Schedule).Sum()
                 }).ToList();

        }
    }
    [Flags]
    public enum ScheduleTypes
    {
        None = 0,
        Daily = 1,
        Weekly = 2,
        Monthly = 4
    }
    public class RecordToSend
    {
        public Guid ApplicationId { get; set; }
        public ScheduleTypes Schedule { get; set; }
    }
}
​