枚举中定义的项目总数

我怎样才能得到在枚举中定义的项目数量?

您可以使用静态方法Enum.GetNames ,该方法返回表示枚举中所有项目名称的数组。 该数组的length属性等于枚举中定义的项目数量

 var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length; 

问题是:

我怎样才能得到在枚举中定义的项目数量?

“物品”的数量实际上可能意味着两个完全不同的东西。 考虑下面的例子。

 enum MyEnum { A = 1, B = 2, C = 1, D = 3, E = 2 } 

MyEnum定义的“项目”的数量是MyEnum

项目数量是5吗? ( ABCDE

还是3? ( 3

MyEnum (5)中定义的名称的数量可以计算如下。

 var namesCount = Enum.GetNames(typeof(MyEnum)).Length; 

MyEnum (3)中定义的的数量可以计算如下。

 var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count(); 

Enum.GetValues (typeof(MyEnum))。Length;

我在这个问题的答案中看到了一个漂亮的技巧,只需在枚举中添加最后一个元素,并使用它来告诉枚举中有多less元素:

 enum MyType { Type1, Type2, Type3, NumberOfTypes } 

在定义除0之外的起始值的情况下,可以使用NumberOfTypes – Type1来确定元素的数量。

我不确定这个方法是否比使用Enum更快,而且我也不确定它是否被认为是正确的方法,因为我们有Enum来为我们确定这个信息。

从以前的答案只是添加代码示例。

  class Program { static void Main(string[] args) { int enumlen = Enum.GetNames(typeof(myenum)).Length; Console.Write(enumlen); Console.Read(); } public enum myenum { value1, value2 } } 

您可以使用Enum.GetNames返回枚举中的IEnumerable值,然后.Count生成的IEnumerable。

GetNames产生与GetValues相同的结果,但速度更快。

[Enum].GetNames(typeof(MyEnum)).Length不适用于我,但[Enum].GetNames(GetType(Animal_Type)).length

如果你发现自己像往常一样写上述解决scheme,那么你可以实现它作为一个通用的:

 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; } 

我刚才正在研究这个问题,对当前解决scheme的可读性不满意。 如果您正在非正式编写代码或在一个小型项目上编写代码,则可以在称为“长度”的枚举的末尾添加另一个项目。 这样,你只需要input:

 var namesCount = (int)MyEnum.Length; 

当然,如果其他人打算使用你的代码 – 或者我确信在许多其他情况下,在这种情况下并不适用于我 – 这个解决scheme可能从任何地方都不适用到可怕的地方。