如何获取枚举中定义的项目数?
答案 0 :(得分:376)
您可以使用静态方法Enum.GetNames
,它返回一个数组,表示枚举中所有项的名称。此数组的length属性等于枚举
var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
答案 1 :(得分:162)
问题是:
如何获取枚举中定义的项目数?
“项目”的数量实际上可能意味着两件完全不同的事情。请考虑以下示例。
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
MyEnum
中定义的“项目”数量是多少?
项目数量是5吗? (A
,B
,C
,D
,E
)
或者它是3? (1
,2
,3
)
MyEnum
(5)中定义的名称的数量可以如下计算。
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
MyEnum
(3)中定义的值的数量可以如下计算。
var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();
答案 2 :(得分:70)
Enum.GetValues(typeof运算(MyEnum))长度;
答案 3 :(得分:12)
我在C回答这个问题时看到的一个漂亮的技巧,只需在枚举中添加最后一个元素并使用它来说明枚举中有多少元素:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
如果您定义的开始值不是0,则可以使用NumberOfTypes - Type1来确定元素的数量。
我不确定这种方法是否比使用Enum更快,而且我也不确定它是否被认为是正确的方法,因为我们让Enum为我们确定这些信息。
答案 4 :(得分:6)
您可以使用Enum.GetNames在枚举中返回IEnumerable值,然后.Count生成IEnumerable。
GetNames产生的结果与GetValues大致相同,但速度更快。
答案 5 :(得分:6)
从之前的答案中只添加代码示例。
class Program
{
static void Main(string[] args)
{
int enumlen = Enum.GetNames(typeof(myenum)).Length;
Console.Write(enumlen);
Console.Read();
}
public enum myenum
{
value1,
value2
}
}
答案 6 :(得分:5)
我今天进行了基准测试,并得出了有趣的结果。在这三个之中:
cellForRow
GetNames(enum)迄今为止最快!
var count1 = typeof(TestEnum).GetFields().Length;
var count2 = Enum.GetNames(typeof(TestEnum)).Length;
var count3 = Enum.GetValues(typeof(TestEnum)).Length;
答案 7 :(得分:4)
如果您发现自己经常编写上述解决方案,那么您可以将其作为通用实现:
public static int GetEnumEntries<T>() where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enumerated type");
return Enum.GetNames(typeof(T)).Length;
}
答案 8 :(得分:1)
对于Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
没有与我合作,但是
[Enum].GetNames(GetType(Animal_Type)).length
做到了。
答案 9 :(得分:1)
我刚才正在研究这个问题,对当前解决方案的可读性感到不满意。如果您正在非正式地编写代码或在小项目上编写代码,则可以在枚举的末尾添加另一个名为“Length”的项。这样,您只需输入:
var namesCount = (int)MyEnum.Length;
当然,如果其他人打算使用你的代码 - 或者我确信在许多其他情况下在这种情况下不适用于我 - 这个解决方案可能是从不明智到可怕的任何地方。