【问题标题】:Iterate over values in Flags Enum - but keep the order迭代 Flags Enum 中的值 - 但保持顺序
【发布时间】:2014-10-31 14:05:03
【问题描述】:

我的代码中有以下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?

【问题讨论】:

  • Column.FirstName | Column.LastNameColumn.LastName | Column.FirstName 是完全相同的值。您所要求的就像拨打电话 Foo(1+1) 的行为与 Foo(2) 不同。
  • ParseColumns() 只接收一个值(在您的情况下它将是int),它显然不包含任何 order 信息。您将需要使用包含订单的合适类型(List、数组等)或提供订单信息作为另一个参数(例如,string 由数字组成,"132" 将指定 FirstName > Address > LastName 订单)。

标签: c# enums


【解决方案1】:

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

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

public void Foo(int x)

你用以下方式调用它:

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

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

public void ParseColumns(params Column[] columns)

...此时您可能希望完全避免它成为标志枚举。

【讨论】:

    【解决方案2】:

    这根本不可能。

    标记枚举值通过添加单个项目的值(每个项目都是一个唯一的位)来工作。

    加法是可交换的,所以你不知道它们是按什么顺序相加的。

    考虑接受一个 (params) 非标志枚举值数组。

    【讨论】:

      【解决方案3】:

      这是不可能的,但这是一个有趣但不是很好的想法......

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

      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();
      }
      

      看看这样的东西是否适合你

      【讨论】:

        猜你喜欢
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        相关资源
        最近更新 更多