連載

C#入門

第16回 列挙型の活用

(株)ピーデー
川俣 晶
2001/11/23
2001/11/25 更新


列挙型のすべての数値を得る

 今度は反対に、名前ではなく、数値の一覧を取得する方法を説明する。以下がそれを記述した例である。

 1: using System;
 2:
 3: namespace ConsoleApplication14
 4: {
 5:   enum Sample
 6:   {
 7:     A=1,
 8:     B=20,
 9:     C=300,
10:     D=4000
11:   }
12:   class Class1
13:   {
14:     static void Main(string[] args)
15:     {
16:       System.Array values = Sample.GetValues( Type.GetType("ConsoleApplication14.Sample") );
17:       foreach( int n in values )
18:       {
19:         Console.WriteLine( n );
20:       }
21:     }
22:   }
23: }
列挙型のすべての値を得るサンプル・プログラム13
System.EnumクラスにあるGetValuesメソッドを使用している。

 これを実行すると以下のようになる。

サンプル・プログラム13の実行結果
列挙型に含まれる数値の一覧が表示される。

 GetValuesメソッドは、ある列挙型に含まれる数値の一覧表を配列として返す機能を持つ。このメソッドに与える引数はGetNamesメソッドのそれと同じである。戻り値はSystem.Array型だが、これはすべての配列のスーパー・クラスに当たるもので、どのような配列を渡すのにも使用できるデータ型である。列挙型はどんな数値型で表現するかをプログラマが指定できるので、このような汎用的なデータ型で戻ってくるのである。

文字列から列挙型の値へ

 外部との入出力に列挙型の名前を使う場合、入力された文字列を列挙型の値に変換しなければならない。そのためにSystem.Enumクラスには、Parseメソッドが存在する。このメソッドは、“Taisho”などの文字列を入力して、その文字列を解析し、それが指定列挙型のTaishoであることを突き止めて、その値を返す。以下はそのメソッドを使用したサンプル・ソースである。

 1: using System;
 2:
 3: namespace ConsoleApplication15
 4: {
 5:   enum Era
 6:   {
 7:     Meiji,
 8:     Taisho,
 9:     Showa,
10:     Heisei
11:   }
12:   class Class1
13:   {
14:     static void Main(string[] args)
15:     {
16:       string target = "Taisho";
17:       Era x = (Era)Enum.Parse( Type.GetType("ConsoleApplication15.Era"), target );
18:       Console.WriteLine( x );
19:       Console.WriteLine( x.GetType().FullName );
20:     }
21:   }
22: }
文字列から列挙型の値を得るサンプル・プログラム14
System.EnumクラスにあるParseメソッドを使用している。

 これを実行すると以下のようになる。

サンプル・プログラム14の実行結果
得られた列挙型の値と、その列挙型のフルネームを表示している。

 17行目が実際にParseメソッドを使用した例である。このメソッドの最初の引数は、列挙型の型である。2番目の引数には、変換する文字列を指定する。このメソッドから戻ってくる値は、汎用的なobject型なので、“(Era)”のようにキャストしてやる必要がある。18行目の出力結果で、正しい値になっていることが分かると思うが、本当にEra型の値であることを示すために、19行目も追加してみた。確かに、ConsoleAplication15.Era型であることが分かると思う。

文字列への変換

 列挙型の値から対応する名前を得る方法はすでに説明したが、これとは少し違う方法もある。以下は、それを使用した例である。

 1: using System;
 2:
 3: namespace ConsoleApplication16
 4: {
 5:   enum Sample
 6:   {
 7:     Alpha,
 8:     Bravo,
 9:     Charlie=10,
10:     Delta=11
11:   }
12:   class Class1
13:   {
14:     static void Main(string[] args)
15:     {
16:       Sample sample = Sample.Delta;
17:       string name1 = sample.ToString();
18:       Console.WriteLine( name1 );
19:       string name2 = sample.ToString("G");
20:       Console.WriteLine( name2 );
21:       string name3 = sample.ToString("X");
22:       Console.WriteLine( name3 );
23:       string name4 = sample.ToString("D");
24:       Console.WriteLine( name4 );
25:     }
26:   }
27: }
列挙型の値から名前を得るサンプル・プログラム15
サンプル・プログラム11とは別の方法で、名前を文字列として取得する。

 これを実行すると以下のようになる。

サンプル・プログラム15の実行結果
ToStringメソッドでは、フォーマット文字列を指定することによって、値を16進数などの文字列でも表示することができる。

 列挙型の値にはToStringメソッドを利用できる。ToStringメソッドはすべてのクラスが持つメソッドなのだが、列挙型では、値に対応する名前を返すように実装されている。そのことが、16〜18行目の結果から分かると思う。しかし、列挙型のToStringメソッドはそれで終わりではない。引数にフォーマット文字列を指定して、複数のフォーマットで文字列に変換することができる。19〜20行目のように“G”を指定した場合は名前を返す。21〜22行目のように、“X”の場合は16進数の文字列として返す。23〜24行目のように、“D”の場合は10進数の文字列として返す。

 このほか、ToStringメソッドにはフォーマット機能を持つインターフェイスを指定して変換する機能などもある。使いこなせば、列挙型はもっと強力なツールになるだろう。

まとめ

 列挙型は、決まりきったいくつかの名前を扱うときに便利な機能である。C++などに見られる単なる数値の別名にすぎない列挙型よりも強力であり、もしかしたら、これらの言語で文字列として処理していたものが、C#では列挙型で処理すべきものになるかもしれない。とりあえず使ってみるのは簡単なので、チャレンジしてみるとよいだろう。

 さて、次回はちょっと複雑で分かりにくいデレゲートについて取り上げたいと考えている。

 それでは次回もLet's See Sharp!End of Article


 INDEX
  第16回 列挙型の活用
    1.列挙型とは何か
    2.数値として使う列挙型
    3.数値指定時のトラブル例
  4.列挙型のすべての数値を得る
 
更新履歴

【2001.11.25】最後の「まとめ」部分で、「C#の列挙型の機能性が他の言語と比較して最も高い」と誤解を招く表現がありましたので一部修正しました。


「C#入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間