我想执行与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#中有没有内置的模块可以做到这一点呢?
发布于 2009-06-11 15:24:04
如果枚举项的值是连续的,则数组方法可以很好地工作。但是,在任何情况下,您都可以使用Dictionary<DayOfTheWeek, string>
(顺便说一句,它的性能较差)。
发布于 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
发布于 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];
https://stackoverflow.com/questions/981776
复制相似问题