[VB.net]Enumとハッシュ

VB.net の列挙名と列挙値のリストをハッシュ化する必要があったので調べた。

まずは列挙の名前の方。

Dim aNames= [Enum].GetString(GetType(Enum型名))
Debug.Print(String.Join(",", aNames))

次は列挙の値の方。

Dim aValues= [Enum].GetValues(GetType(Enum型名))
Debug.Print(String.Join(",", aValues))

得た列挙名と値のリストを合体させる

'VBでハッシュテーブルを作る
Function createHash(aNamess() As String, aValues() As Integer)
    Dim ht As Hashtable = New Hashtable
      For Each item In aNamess.Select(Function(Value, Index) New With {Value, Index})
        Dim key As String = item.Value ' コレクションの要素
        Dim index As Integer = item.Index ' ループのインデックス
        Dim val As Integer = aValues(index)
        ht.Add(key, Val)
    Next
    Return ht
End Function

なお、ソース内で使用するenumの列挙子の情報(enumの型名、列挙子の名前、列挙値)を得ることはできるが、参照元でgetEnumValInfo(EnumFuga.Hero)の様に
Enumの列挙子を指定しないうまくいかない。

Public Function getEnumValInfo(enumItem As Object) As String()
    Dim enumType = enumItem.GetType()
    Dim enumItemName = [Enum].GetName(enumType, enumItem)
    Return {enumType.Name, enumItemName, enumItem}
End Function
Public Enum EnumRcIndex
    TypeName
    ItemName
    ItemValue
End Enum

あとは変換先のEnumのハッシュを作り、 変換元のEnum列挙子の情報を得て、先のハッシュに読ませれば・・・

Dim strCollectionB() As String = [Enum].GetNames(GetType(EnumB))
Dim intCollectionB() As Integer = [Enum].GetValues(GetType(EnumB))
Dim aRc1 = getEnumValInfo(EnumA.Hero)
Dim rc = enumHtB(aRc1(EnumRcIndex.ItemName))

トあるEnumAのHeroから別のEnumBのHero値を得られるハズ。

あと列挙型のデータ型は、Integer以外にもStringも指定できるから抽象型(T)で書かないといけないのかもしれない。

それにしても、うーむ、気が付かないうちに、Pythonにでも侵されていたのかな。全然VBコードじゃない。てか、ここまでくると、サンプルの多いC#の方が読みやすいだろうw(普通に

ここまで来るとVBを使う用途は

使い古したVBソースは二度と書き変えたくない。
~ Slanirish Warlander 「変装現実」より~

以外にありえないだろう。(爆笑

参考

列挙型(Enum)に文字列や数値を利用する

[VB.NET] Enum の要素数を知る

列挙体のメンバの値や名前を列挙する

foreachループで現在の繰り返し回数を使うには?

ハッシュテーブル(連想配列)を使うには?




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA