首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C#中使用枚举作为数组索引

在C#中使用枚举作为数组索引
EN

Stack Overflow用户
提问于 2009-06-11 15:22:21
回答 9查看 60K关注 0票数 33

我想执行与this question相同的操作,即:

enum DaysOfTheWeek {Sunday=0, Monday, Tuesday...};
string[] message_array = new string[number_of_items_at_enum];

...

Console.Write(custom_array[(int)DaysOfTheWeek.Sunday]);

然而,我宁愿有一些不可或缺的东西,而不是编写这种容易出错的代码。在C#中有没有内置的模块可以做到这一点呢?

EN

回答 9

Stack Overflow用户

发布于 2009-06-11 15:24:04

如果枚举项的值是连续的,则数组方法可以很好地工作。但是,在任何情况下,您都可以使用Dictionary<DayOfTheWeek, string> (顺便说一句,它的性能较差)。

票数 22
EN

Stack Overflow用户

发布于 2018-06-21 20:55:17

从C# 7.3开始,就可以使用System.Enum as a constraint on type parameters了。因此,不再需要其他一些答案中令人讨厌的黑客攻击。

下面是一个非常简单的ArrayByEum类,它准确地完成了所提出的问题。

注意,如果枚举值不是连续的,那么它将浪费空间,并且不能处理对于int来说太大的枚举值。我确实说过这个例子非常简单。

/// <summary>An array indexed by an Enum</summary>
/// <typeparam name="T">Type stored in array</typeparam>
/// <typeparam name="U">Indexer Enum type</typeparam>
public class ArrayByEnum<T,U> : IEnumerable where U : Enum // requires C# 7.3 or later
{
  private readonly T[] _array;
  private readonly int _lower;

  public ArrayByEnum()
  {
    _lower = Convert.ToInt32(Enum.GetValues(typeof(U)).Cast<U>().Min());
    int upper = Convert.ToInt32(Enum.GetValues(typeof(U)).Cast<U>().Max());
    _array = new T[1 + upper - _lower];
  }

  public T this[U key]
  {
    get { return _array[Convert.ToInt32(key) - _lower]; }
    set { _array[Convert.ToInt32(key) - _lower] = value; }
  }

  public IEnumerator GetEnumerator()
  {
    return Enum.GetValues(typeof(U)).Cast<U>().Select(i => this[i]).GetEnumerator();
  }
}

用法:

ArrayByEnum<string,MyEnum> myArray = new ArrayByEnum<string,MyEnum>();
myArray[MyEnum.First] = "Hello";

myArray[YourEnum.Other] = "World"; // compiler error
票数 10
EN

Stack Overflow用户

发布于 2014-11-03 18:47:20

枚举的紧凑形式,用作索引,并将任何类型分配给字典和强类型。在这种情况下,将返回浮点值,但值可以是具有属性和方法等的复杂类实例:

enum opacityLevel { Min, Default, Max }
private static readonly Dictionary<opacityLevel, float> _oLevels = new Dictionary<opacityLevel, float>
{
    { opacityLevel.Max, 40.0 },
    { opacityLevel.Default, 50.0 },
    { opacityLevel.Min, 100.0 }
};

//Access float value like this
var x = _oLevels[opacitylevel.Default];
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/981776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档