如何创建一个枚举类型的数组

14
我有大约30个不同的标记枚举,我想将它们放入一个数组中以进行索引和快速访问。请注意,我没有一个包含30个值的枚举,而是有30个带有不同数量值的枚举。
目标是将它们添加到指定索引的数组中。这样我就可以编写一个函数,可以将数组索引传递给它,用于设置枚举的特定值。
更新: 以下是我想要做的示例。
枚举主要( enum1 = 0, enum2 = 1, enumn = n-1 ) - 这里的索引将与相关联的枚举的索引相匹配
[flag] enum1(value1=0, value2=1, value3=2, value4=4...)
[flag] enum2("")
[flag] enum2("")
由于我正在使用可标记的枚举,所以我有一个如下所示的类。
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
}

10
也许提供一份代码示例会更有帮助......但是对我来说这一点都不合理。 - Justin Niessner
3
为什么您希望将不同类型的内容放入同一个数组中? - fbstj
2
“用于索引和快速访问”?由谁或者由什么实现?您想将大量的整数、字符串和浮点数放入数组中以便索引和快速访问吗?为什么要将这些枚举视为相关实体?我强烈怀疑,无论您想做什么,将枚举抛进数组都不是正确的解决方案。 - Pontus Gagge
1
这是最糟糕的想法,你完全没有理解枚举的意义。听起来你需要一个字典,而不是一个枚举列表。 - Piotr Rochala
4个回答

28

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

Enum[] enums = new Enum[] { enum1.Value1, enum2.Value2, etc };
您需要在从数组中获取枚举时进行类型转换,以获得强类型枚举值。

与将数组键入为“object”相比,这确实没有任何好处。 “ValueType”是(令人费解的)引用类型,因此值仍将被装箱。 - Adam Robinson
1
那么,为什么不直接使用 Enum[]? - digEmAll
1
@digEmAll - 你仍然需要进行类型转换,但至少数组中不会包含任何不是枚举的内容。 - Nelson Rothermel
@Nelson:是的,强制类型转换是不可避免的(事实上我仍然不明白为什么要这样)。但至少比对象数组更具编译时安全性... - digEmAll
今天我看了几次Enum[],但就是没完全搞明白,可能是我的大脑出了点问题。感谢你的帮助。 - user381347

2

如果我理解正确,您需要做以下事情:

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

但是这样访问数组就需要像这样(不是强类型的,并且很容易引用错误的索引):
if ((Enum1)enums[0] == Enum1.Value1)
...

在.NET 4中,您可以使用Tuple:
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)
...

我建议采用最后一种方式,因为您使用的是引用类型,不依赖于索引位置,可以随意命名属性,并且它是强类型的。唯一的缺点是不能轻松地遍历列表,但如果确实需要,可以通过反射来实现。

也许将其作为结构体而不是类会更好。 - Dykam
元组类型中有8个通用参数的限制。按照惯例,最后一个通用参数是包含额外值的元组,因此您可以使用以下方式创建具有超过8个元素的元组: var a = new Tuple<int, int, int, int, int, int, int, Tuple<int, int>>(); 但这种处理方式并不是很好。 - Wesley Wiser
@Dykam:结构体通常用于一个值,以防止具有多个副本的大型对象。如果你有几个枚举,也许可以考虑使用,但我认为30个枚举应该是引用类型。 - Nelson Rothermel
@wawa:我之前没有想到这个…… :) 这就像是有深度嵌套的数组。呃! - Nelson Rothermel
1
@Nelson:是的,除非你使用像F#这样的编程语言,其编译器可以为你处理这些问题,否则这很恶心。 - Wesley Wiser

0

枚举(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类型获取枚举值,我不太确定为什么您想要创建自己的数组。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接