【问题标题】:How to create an array of enums如何创建枚举数组
【发布时间】:2011-03-10 18:29:30
【问题描述】:

我有大约 30 个不同的标记枚举,我想将它们放入一个数组中以进行索引和快速访问。我还要澄清一下,我没有 1 个具有 30 个值的枚举,但我有 30 个具有不同数量值的枚举。

目标是将它们添加到指定索引处的数组中。这样我可以编写一个函数,我可以在其中传递数组索引来设置枚举的特定值。

更新: 这是我想做的一个例子。

枚举主要( 枚举1 = 0, 枚举2 = 1, enumn = n-1 ) - 这具有与关联枚举的索引匹配的索引

[标志] enum1(value1=0, value2=1, value3=2, value4=4...)

[标志] 枚举2("")

[标志] 枚举2("")

因为我使用的是可标记枚举,所以我有一个类似以下的类

public static class CEnumWorker
{
   public static enum1 myEnum1 = enum1.value1;
   public static enum2 myEnum2 = enum2.value1;
   public static enumN myEnumN = enumN.value1;

   //I would then have functions that set the flags on the enums. I would like to access the enums through an array or other method so that I do not have to build a large switch statement to know which enum I am wanting to manipulate
}

【问题讨论】:

  • 也许代码示例会有所帮助......但这对我来说没有一点意义。
  • 为什么要将不同的类型放在同一个数组中?
  • “用于索引和快速访问”?由谁或由什么?您想将大量整数、字符串和浮点数放入数组中以进行索引和快速访问吗?为什么要将这些枚举视为相关实体?我强烈怀疑无论你想做什么,将枚举扔进数组都是错误的解决方案。
  • 这是有史以来最蹩脚的想法,你完全错过了枚举的意义。听起来您需要字典,而不是枚举列表。

标签: c# arrays enums


【解决方案1】:

由于您有 30 种不同类型的枚举,因此您无法为它们创建强类型数组。你能做的最好的就是一个 System.Enum 数组:

Enum[] enums = new Enum[] { enum1.Value1, enum2.Value2, etc };

如果您需要强类型枚举值,则必须在从数组中拉出枚举时进行强制转换。

【讨论】:

  • 与将数组键入为object 相比,这确实没有任何好处。 ValueType 是(不直观的)引用类型,因此值仍将被装箱。
  • 那么,为什么不直接 Enum[] 呢?
  • @digEmAll - 你仍然需要强制转换,但至少数组不能包含任何不是枚举的东西。
  • @Nelson:是的,强制转换是不可避免的(事实上我仍然不明白这种数组的原因),但至少你比对象数组有更多的编译时安全性。 ..
  • 当我今天考虑使用 Enum[] 几次但从未完全解决时,我一定是有一个非常大的大脑放屁。感谢您的所有帮助。
【解决方案2】:

如果我理解正确,你必须这样做:

object[] enums = new object[30];
enums[0] = Enum1.Value1;
enums[1] = Enum2.AnotherValue;

但是你必须像这样访问(不是强类型,并且容易引用错误的索引):

if ((Enum1)enums[0] == Enum1.Value1)
...

在 .NET 4 中,您可以使用元组:

var enums = new Tuple<Enum1, Enum2>(Enum1.Value1, Enum2.AnotherValue);

if (enums.Item1 == Enum1.Value1)
...

...但我不推荐它用于这么多 (30) 个枚举,我认为甚至有 8 个左右的限制。你也可以创建自己的类:

class Enums
{
  public Enum1 Enum1 { get; set; }
  public Enum2 Enum2 { get; set; }
}

Enums enums = new Enums();
enums.Enum1 = Enum1.Value1;
enums.Enum2 = Enum2.AnotherValue;

if (enums.Enum1 == Enum1.Value1)
...

我会推荐最后一种方式,因为您使用的是引用类型,您不依赖于索引位置,您可以为属性指定任何您想要的名称,并且它是强类型的。您“失去”的唯一一件事是轻松遍历列表的能力,但如果您真的需要,您可以使用反射来实现。

【讨论】:

  • Mabye 让它成为一个结构而不是一个类。
  • 元组类型的泛型参数限制为 8 个。按照惯例,最后一个通用参数是一个包含附加值的元组,因此您可以使用以下内容创建一个超过 8 个的元组:var a = new Tuple>();但这不会很好处理。
  • @Dykam:结构体通常用于 one 值,以防止大对象具有多个副本。如果你有几个枚举,也许可以,但我认为 30 个枚举真的应该是一个引用类型。
  • @wawa:我没想到... :) 就像拥有深度嵌套的数组一样。咳!
  • @Nelson:是的,除非您使用 F# 之类的语言,其编译器会为您处理这些问题,否则这很恶心。
【解决方案3】:

你总是可以使用旧的object[],但这意味着要进行大量的转换。

【讨论】:

    【解决方案4】:

    Enum 提供了两种将整数转换为枚举值的机制 - GetValues() 方法和普通转换:

    enum EnumA { A1, A2, A1234 }
    enum EnumB { B00, B01, B02, B04 }
    
    class Program
    {
        static void Main(string[] args)
        {
            EnumA a = ((EnumA[])Enum.GetValues(typeof(EnumA)))[0];
    
            Console.WriteLine(a);
    
            EnumB boa = (EnumB)3;
    
            Console.WriteLine(boa);
        }
    }
    

    如果您可以使用其中一种机制从 int 获取枚举,我不太确定为什么要创建自己的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2016-12-25
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      相关资源
      最近更新 更多