列挙型で定義されている項目の数を取得する方法
列挙型内のすべての項目の名前を表す配列を返す静的メソッド Enum.GetNames
を使用できます。この配列のlengthプロパティは、enumで定義されているアイテムの数と同じです。
var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
質問は:
列挙型で定義されている項目の数を取得する方法
「項目」の数は、実際にはまったく異なる2つのことを意味します。次の例を考えてください。
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
MyEnum
name__に定義されている「項目」の数はいくつですか?
項目数は5ですか? (A
name__、B
name__、C
name__、D
name__、E
name__)
それとも3ですか? (1
、2
、3
)
MyEnum
name__(5)で定義されているnamesの数は、次のように計算できます。
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
MyEnum
name__(3)で定義されているvaluesの数は、次のように計算することができます。
var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();
Enum.GetValues (typeof(MyEnum))。長さ。
この質問に対するCの答えで見た気の利いたトリックは、列挙型に最後の要素を追加し、それを使用して列挙型内の要素の数を判断することです。
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
0以外の開始値を定義している場合は、NumberOfTypes - Type1を使用して要素数を確認できます。
この方法がEnumを使用するよりも速いかどうかはわかりません。また、Enumでこの情報を確認する必要があるため、これが適切な方法であると考えられるかどうかもわかりません。
Enum.GetNamesを使用して、enum内の値のIEnumerableを返してから、結果のIEnumerableをカウントできます。
GetNamesは、GetValuesとほぼ同じ結果を生成しますが、高速です。
上記の回答から、コードサンプルを追加するだけです。
class Program
{
static void Main(string[] args)
{
int enumlen = Enum.GetNames(typeof(myenum)).Length;
Console.Write(enumlen);
Console.Read();
}
public enum myenum
{
value1,
value2
}
}
私と同じくらい頻繁に上記の解決策を書いていると思うなら、それを一般的なものとして実装することができます:
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;
}
Visual Basicの場合
[Enum].GetNames(typeof(MyEnum)).Length
は私とはうまくいきませんでしたが、[Enum].GetNames(GetType(Animal_Type)).length
はうまくいきました。
私は今これを調べていましたが、現在のソリューションの読みやすさに満足していませんでした。コードを非公式に、または小規模なプロジェクトで書いている場合は、列挙型の最後に "Length"という項目を追加するだけで済みます。このように、あなただけタイプする必要があります:
var namesCount = (int)MyEnum.Length;
もちろん、他の人があなたのコードを使用しようとしているなら - あるいはこの場合私には当てはまらなかった他の多くの状況の下で私は確信しています - この解決策は悪いから悪いものまでどこにでもあるかもしれません。