C# 将枚举值列表减少为单个int

C# 将枚举值列表减少为单个int,c#,C#,我有一个枚举,它为一些数据指定类别(列)。我希望能够存储排序顺序,以便将这些枚举的列表作为单个int值。因此,无论列表的大小(在合理范围内),都有一个唯一的int可以重建列表 public enum SortingCategories { ORDER_DATE = 1, CUSTOMER_STATE = 2, CUSTOMER_NAME = 3, CUSTOMER_HAIRCOLOR = 4, ...

我有一个枚举,它为一些数据指定类别(列)。我希望能够存储排序顺序,以便将这些枚举的列表作为单个int值。因此,无论列表的大小(在合理范围内),都有一个唯一的int可以重建列表

    public enum SortingCategories
    {
        ORDER_DATE = 1,
        CUSTOMER_STATE = 2,
        CUSTOMER_NAME = 3,
        CUSTOMER_HAIRCOLOR = 4,
        ...
    }

    public IEnumerable<SortingCategories> GetSortingOrder(int code)
    {
        ...
    }

    public int GetSortingCode(IEnumerable<SortingCategories> order)
    {
        ...
    }

    public const List<SortingCategories> PossibleSortingOrder = new List<SortingCategories>()
    {
        SortingCategories.CUSTOMER_NAME,
        SortingCategories.CUSTOMER_STATE,
        SortingCategories.ORDER_DATE,
        SortingCategories.CUSTOMER_HAIRCOLOR
    };

    public const List<SortingCategories> AnotherPossibleSortingOrder = new List<SortingCategories>()
    {
        SortingCategories.CUSTOMER_STATE,
        SortingCategories.CUSTOMER_HAIRCOLOR
    };
公共枚举分类
{
订单日期=1,
客户状态=2,
客户名称=3,
客户头发颜色=4,
...
}
公共IEnumerable GetSortingOrder(int代码)
{
...
}
公共整数GetSortingCode(IEnumerable顺序)
{
...
}
public const List PossibleSortingOrder=新列表()
{
SortingCategories.CUSTOMER\u名称,
SortingCategories.CUSTOMER\u状态,
SortingCategories.ORDER_日期,
SortingCategories.CUSTOMER\u头发颜色
};
public const List AnotherPossibleSortingOrder=新列表()
{
SortingCategories.CUSTOMER\u状态,
SortingCategories.CUSTOMER\u头发颜色
};

假设已设置枚举,其中每个值都是2的唯一幂,如下所示:

[Flags]
public enum SortingCategories
{
    ORDER_DATE = 1,
    CUSTOMER_STATE = 2,
    CUSTOMER_NAME = 4,
    CUSTOMER_HAIRCOLOR = 8,
}
您可以使用扩展方法:

var myEnumList = new List<SortingCategories>()
{
    SortingCategories.CUSTOMER_NAME,
    SortingCategories.CUSTOMER_STATE,
    SortingCategories.ORDER_DATE,
    SortingCategories.CUSTOMER_HAIRCOLOR
};

var myEnumValue = myEnumList.Aggregate((x, y) => x | y);
请注意,与前面的方法不同,此方法假定枚举值的范围为0到N,就好像您没有为枚举成员指定任何显式值一样。可以通过使用以下内容对其进行修改以支持任何值:

int numberOfMembers = Enum.GetValues(typeof(SortingCategories)).Cast<int>().Max() + 1;
int numberOfMembers=Enum.GetValues(typeof(SortingCategories)).Cast().Max()+1;

如果值小于10,就将它们串联起来怎么样

例如


传统上,解决方案是为此目的使用二进制标志。这样可以保存选项,但不能保存顺序。除非为每个合法组合创建标志,否则无法保存选择并在单个数字中排序。但是,您可以为这样的列表构造自己的自定义字符串格式。i、 e){3}{6}{1}并在进行排序之前将这些值转换为
SortingCategories

下面是flags选项的外观

public enum SortingCategories
{
    ORDER_DATE = 0x1,
    CUSTOMER_STATE = 0x2,
    CUSTOMER_NAME = 0x4,
    CUSTOMER_HAIRCOLOR = 0x8,
    ...
}
然后使用二进制运算符。i、 (e)


这只会屏蔽列,而不是它们的order@RobvanderVeer这是一个很好的观点,但并不完全清楚这是必要的。没错,我是这么认为的。如果要对列进行排序,则这有点相关。必须是一个专业的障碍来承担的东西。很抱歉,我想得太超前了。@robvandervier看来你的直觉是正确的。受您的回答(+1 BTW)的启发,我提供了一个解决方案,该解决方案应适用于具有任意数量成员(在一定限制内)的枚举。您能否提供更多的上下文,说明您为什么尝试这样做?这将有助于我们为您提供最佳指导。您还需要重建列表中项目的顺序吗?@reuben我想将用户的排序顺序保存在database@jimmyjambles您真的只限于用一个
int
来表示这一点吗?或者你真的在寻找在数据库中高效存储排序顺序的方法吗?@reuben我想最有效的方法是Hanks,我想知道是否有一种更快的方法可以通过这种方式将其序列化和反序列化到单个整型中,或者有一种方法可以支持10个以上不同的枚举值。没有理由必须以10为基数。它可以是基数11、12或13…,你只是在用“独特项目的数量”来交换“列表中的位置数量”。位置n正好(num/base pow n)%base。n 0:随便了。当然是整数除法。我想你可能想从
0x1
开始。你是对的,我会更新它。我确实使用0x0,但它始终表示无。
1324
2341
4231
public enum SortingCategories
{
    ORDER_DATE = 0x1,
    CUSTOMER_STATE = 0x2,
    CUSTOMER_NAME = 0x4,
    CUSTOMER_HAIRCOLOR = 0x8,
    ...
}
uint categories = SortingCategories.ORDER_DATE | SortingCategories.CUSTOMER_NAME;

if((categories & SortingCategories.ORDER_DATE) == SortingCategories.ORDER_DATE)
    do something...