2009-05-13 5 views

答えて

304

列挙内のすべての項目の名前を表す配列を返すstaticメソッドEnum.GetNamesを使用できます。この配列のlengthプロパティは、列挙型で定義された項目の数と同じです。

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

合意しました...ここに私が見つけたリンクhttp://www.csharp411.com/c-count-items-in-an-enum/ –

+5

Enum.GetValuesを使うこともできます。 – Xonatron

+0

System.Enum.GetNames(System名前空間がまだ含まれていない場合) –

67

Enum.GetValues(typeof(MyEnum))。

+2

それはによりgetNamesメソッドを使用して高速です。 –

+0

結果をユーティリティクラスにキャッシュする必要がありますか? – djmj

+1

私はこれをロールバックしました - そうでなければ、受け入れられた答えのあまり役に立たないバージョンです。 – Flexo

5

Enum.GetNamesを使用すると、enumの値のIEnumerableを返し、結果のIEnumerableを取得することができます。

GetNamesはGetValuesと同じ結果を生成しますが、より高速です。

6

これまでのコードサンプルを追加するだけです。で

enum MyType { 
    Type1, 
    Type2, 
    Type3, 
    NumberOfTypes 
} 

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

私はこの質問へのCの答えで見た気の利いたトリックは、単に列挙しているどのように多くの要素を伝えるために列挙型への最後の要素を追加し、それを使用します0以外の開始値を定義している場合は、NumberOfTypes - Type1を使用して要素の数を確認できます。

この方法がEnumを使用するよりも高速であるかどうかは不明ですし、この情報を確認するためにEnumがあるので、これが正しい方法であるかどうかもわかりません。

+0

GetNamesが利用できないので、XNAでこれを行うことができるので、これはいいです。 –

+0

クールなトリックですが、これはGetNames()よりも高速です。 –

+3

foreachを使用して列挙型を循環するコードに注意してください。配列の最後を読むことができます! –

140

質問です:

どのように私は列挙型で定義された項目の数を得ることができますか?

「アイテム」の数は、実際には2つの全く異なるものを意味する可能性があります。次の例を考えてみましょう。

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

MyEnumで定義されている「アイテム」の数はいくつですか?

アイテム数は5ですか? (ABCDE

それとも3ですか? (123

次のように(5)MyEnumに定義された数を計算することができます。

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

次のように(3)を計算することができるMyEnumで定義さの数。 Visual Basicのために

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

これはトップに投票する必要があります。 – Xonatron

+1

'var valuesCount =((MyEnum [])Enum.GetValues(typeof(MyEnum)))。Distinct()。Count();'最後の行を書き換える別の方法です。 –

3

[Enum].GetNames(typeof(MyEnum)).Lengthは私と一緒に動作しませんでしたが、 [Enum].GetNames(GetType(Animal_Type)).lengthはなかったです。

+0

なぜdownvote?これは私の問題を修正しました。VBの正しい構文です。質問はC#でタグ付けされていますが、それでも便利です。 –

+0

おそらく質問はC#とタグ付けされているので、下降はおそらくC#を使用していないと言わなかった。 – idbrii

-1

私はこれを今見ていて、現在のソリューションの可読性に満足していませんでした。非公式に、あるいは小規模なプロジェクトでコードを書く場合は、列挙の最後に「長さ」という項目を追加するだけです。この方法では、あなただけ入力する必要があります。他の人があなたのコードを使用しようとしている場合はもちろん

var namesCount = (int)MyEnum.Length; 

- または私はこのケースでは、私には適用されませんでした他の多くの状況下では確信している - この解決策かもしれませんひどいことをアドバイスされた病気からどこにでもいてください。

+1

これはまた、0から始まる列挙型に依存しています(デフォルトですが、決して保証されません)。さらに、それは通常の列挙型使用のためのインテリセンスを非常に混乱させる。これはほぼ常に**恐ろしい**アイデアです。 – BradleyDotNET

+1

それは長くかかりませんでした:) – EnergyWasRaw

+1

興味深いことに、何か良いことがいつ来るかわからないと思います。私は自分のソリューションを排除するための最善の試みをしましたが、共有するのに十分興味深いと感じました! – EnergyWasRaw

2

あなた自身ができるだけ頻繁に私は、あなたが一般的なようにそれを実装することができないとして、上記の溶液を書く見つけた場合:

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; 
} 
関連する問題