迭代Flags Enum中的值 - 但保留顺序

时间:2014-10-31 14:05:03

标签: c# enums

我的代码中有以下enum

[Flags]
public enum Column
{
    FirstName = 1 << 0,
    LastName = 1 << 1,
    Address = 1 << 2,
}

现在我的方法可以采用enum

public void ParseColumns(Column col)
{
    //do some parsing...
}

可以像这样调用此方法:

ParseColumns(Column.FirstName | Column.LastName);
ParseColumns(Column.LastName);
ParseColumns(Column.LastName | Column.Address | Column.FirstName);
ParseColumns(Column.Address | Column.FirstName);

我现在需要遍历值,但保持enum传递给方法的顺序。

我找到了以下方法,它让我有可能迭代它们,但遗憾的是它返回它在Enum本身中定义的顺序,而不是我如何调用该方法。 Iterate over values in Flags Enum?

3 个答案:

答案 0 :(得分:8)

  

我现在需要迭代值,但保持枚举传递给方法的顺序。

没有这样的概念。 |运算符没有任何保留排序的方法。换句话说,想象我们有:

public void Foo(int x)

你打电话给:

Foo(1 + 4)
Foo(2 + 3)

您期望它如何区分?如果您需要使用特定的保留顺序传递单独的值,则应该使用:

public void ParseColumns(params Column[] columns)

......此时你可能想要避免它成为一个标志枚举。

答案 1 :(得分:3)

这根本不可能。

标志枚举值的工作原理是添加各个项目的值(每个项目都是一个唯一的位)。

添加是可交换的,因此您无法分辨它们的添加顺序。

考虑接受(params)非标记枚举值数组。

答案 2 :(得分:0)

它不可能,但是一个有趣但不太好的想法...

你可以做的是组合一个扩展方法(因为运算符重载不起作用)与位移...序列化然后反序列化值...仍然听起来像一个坏主意,哈哈哈。

public static Column OR(this Column original, Column newc) {
    return (Column) ((int)original)| (((int) newc) << 3)
}
public static Column Get(this Column original) {
    // Some iterator that looks almost like the one you already have
}
public static Column GetOrder(this Column original) {
    // Some iterator that looks almost like the one you already have
}

然后您可以按如下方式调用

ParseColumns(Column.FirstName.OR(Column.LastName))

然后实现类似于:

public void ParseColumns(Column col)
{
    col.Get();
    col.GetOrder();
}

检查这样的事情是否适合你

相关问题