列挙型の値を List に変換する

Enum.GetValues メソッドを使って値の配列を取得。さらに Enumerable.Cast メソッドと ToList メソッドを使い List に変換します。

Dim list = [Enum].GetValues(GetType(列挙体)).Cast(Of 列挙体)().ToList()
var list = Enum.GetValues(typeof(列挙体)).Cast<列挙体>().ToList();

これでおk

こんな感じで使います。

' VB.NET
Option Explicit On
Option Strict On

Imports System.Linq

Module Module1
    Enum BayStars
        Kisyoshi = 0
        Miura = 1
        Blanco = 2
        Nori = 3
        Aranami = 4
    End Enum

    Sub Main()
        Dim enumValues = [Enum].GetValues(GetType(BayStars)).Cast(Of BayStars)().ToList()
        For Each value In enumValues
            Console.WriteLine(value)
        Next
        Console.ReadLine()
    End Sub
End Module
// C#
using System;
using System.Linq;

class Program {
    enum BayStars {
        Kisyoshi = 0,
        Miura = 1,
        Blanco = 2,
        Nori = 3,
        Aranami = 4,
    };

    static void Main(string[] args) {
        var enumValues = Enum.GetValues(typeof(BayStars)).Cast<BayStars>().ToList();
        foreach (var value in enumValues) {
            Console.WriteLine(value);
        }
        Console.ReadLine();
    }
}

列挙型の落とし穴

#2013/05/27 17:50 追記
このエントリ公開したら [twitter:@ugaya40] さんより有難い指摘頂きました。重複Enumだと同値が上書き*1される問題があるようです。

例えば

class Program {
    // わざとポジションをかぶらせてみる・・・
    enum BayStars {
        Tsutsugo = 5,
        Nori = 5,
        Aranami = 8,
        Morgan = 8
    };

    static void Main(string[] args) {
        var enumValues = Enum.GetValues(typeof(BayStars)).Cast<BayStars>().ToList();
        foreach (var value in enumValues) {
            Console.WriteLine(value);
        }
        Console.ReadLine();
    }
}

とか書くと

Nori
Nori
Aranami
Aranami

という楽しい結果になってしまうという問題 \(^o^)/
さらに

とご指摘のように System.Windows.Input.Key 列挙体なんかだと、もう目も当てられない事態に。。。
まあ値を明示的に指定しないならいいのでしょうが、使いどころ考えて慎重に使う必要がありますね。


文字列列挙体もどき?

あと [twitter:@masaru_b_cl] さんが記事書かれてますが、JavaEnumっぽいもの*2もいいかもしれませんね。

文字列列挙体っぽい挙動をするものbeta


#言語仕様ネタはワリと好きだったりしてw


 


  

*1:この表現が適当かどうか・・・

*2:よく知らないが