質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

33219閲覧

C#にてenumの要素数を取得する方法

urahimono

総合スコア714

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/06/07 22:27

C#にてenumの要素数を取得する方法について質問があります。

以前までenumの最後にCOUNTなどの名前で要素数をカウントする要素を設定して取得していたのですが、途中で数値を指定した場合に対応できないため、System.Enum.GetValues()を利用して要素数を取得する形に変更しました。

CS

1enum ETest 2{ 3 A, 4 B, 5 C, 6 D = 100, 7 E, 8 9 // 数値が1つずつインクリメントしない場合は対応できない 10 COUNT, 11}

CS

1enum ETest 2{ 3 A, 4 B, 5 C, 6 D = 100, 7 E, 8} 9 10int[] m_tests = new int[ System.Enum.GetValues( typeof( ETest ) ).Length ];

ただSystem.Enum.GetValues()にて要素数を取得する場合に、一度配列にしてからその長さを測る形になってしまい、処理負荷や一時的なメモリの使用量などに少し不安があります。

もっと簡単にenumの要素数を取得する方法をご存じないでしょうか。
ご教授お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

typeofで取得できる方法がありますよ。
これだとコンパイル時に最適化されているかと思います。

Enum.GetNames(typeof(enum)).Length

投稿2016/06/07 23:46

red_bb

総合スコア71

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

enum って定数リテラルですよね?
なら要素数はコンパイル時に決まっているはずだし,System.Enum.GetValuesstaticだったと思うので,いちいち配列確保して〜なんてことをランタイムではやらないのでは?
(しばらく C# 触ってないから忘れてるだけかもしれませんが…)

心配ならstatic constとかで一度だけ計算して定数として保持してればいいのでは?

投稿2016/06/07 22:46

tamy

総合スコア442

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urahimono

2016/06/08 10:42

なるほど。 ランタイム時でないのなら、あまり気にする必要はないのかもしれませんね。 皆様の多くの回答ありがとうございました。
guest

0

そんな負荷は気にしなくても大丈夫ですよ。
何万回ものループの内部で enum の要素数を取得してもほとんど時間はかかりません。
どうしても気になるならループに入る前に要素数を取得して変数に入れておけばいいと思います。

投稿2016/06/07 22:42

編集2016/06/07 22:44
Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問