Back to Top

プログラムの覚書

Category: VB構文・その他

VB.NET列挙体(Enum)

Enum(列挙子)の基本的な使い方を説明します。

列挙体のメンバの値(整数値のみ)や名前を列挙するクラスです。

列挙体を定義するにはEnum ~ End Enum

何も宣言しなければデフォルトでInt32型となり、宣言した順に0から値が振られます。

Enum DayWeek
    Sunday
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
End Enum

内部の型や値を指定することも可能です。

下記ではUInteger型となり、宣言した順に1から値が振られます。

Enum DayWeek As UShort
    Sunday = 1
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
End Enum

<Flags>属性を付けてビットフィールドとして扱う事もできます。

<Flags()>
Enum DayWeek As UShort
    Sunday = 1
    Monday = 2
    Tuesday = 4
    Wednesday = 8
    Thursday = 16
    Friday = 32
    Saturday = 64
End Enum

列挙体のメンバの値を列挙する

Dim val As DayWeek
For Each val In [Enum].GetValues(GetType(DayWeek))
    'メンバの名称と値を取得する
    Dim sName As String = [Enum].GetName(GetType(DayWeek), val)

    MessageBox.Show(sName & " " & CInt(val).ToString())
Next

'名前のみ
For Each DayName As String In [Enum].GetNames(GetType(DayWeek))
    MessageBox.Show(DayName)
Next

'値のみ
For Each v As UShort In [Enum].GetValues(GetType(DayWeek))
    MessageBox.Show(v.ToString())
Next

文字列からEnum値に変換する

Enum.Parseメソッド または Enum.TryParseメソッド を使用します。

' Enum.Parse()
Dim w As DayWeek = DirectCast([Enum].Parse(GetType(DayWeek), "Friday"), DayWeek)
Dim eName As String = [Enum].GetName(GetType(DayWeek), w)
MessageBox.Show(eName & " " & CInt(w).ToString())


'Enum.TryParse()
[Enum].TryParse(Of DayWeek)("Wednesday", w)
Dim sName2 As String = [Enum].GetName(GetType(DayWeek), w)
MessageBox.Show(sName2 & " " & CInt(w).ToString())

 

VB.NET ArrayListのジェネリッククラス

ArrayListのジェネリック版List・LinkedList・Stack・Queueの説明をします。

インスタンス化するときに、データ型を指定するので、取り出すときキャストする必要がありません。どんなデータ型でも使用できます。

注意としては、もともとオブジェクト型なので、Stringでインスタンス化しても他の型のデータも受け入れてしまうところです。

Listクラス

'String型のListとしてインスタンス化
Dim strList As New List(Of String)

strList.Add("AAA")
strList.Add("BBB")

'インデックスによる参照(キャスト不要)
Dim s As String = strList(1)

'Integer型のListとしてインスタンス化
Dim intList As New List(Of Integer)

intList.Add(100)
intList.Add(200)

Dim v As Integer = intList(1)

LinkedListクラス

Listのようにインデックスによるデータの参照はできませんが、リストの途中への要素の削除と挿入が高速にできます。

Dim strLinkList = New LinkedList(Of String)

'1つ目の要素を追加
strLinkList.AddFirst("First")

'先頭の要素の後に追加
strLinkList.AddAfter(strLinkList.First, "After")

'すべての要素を順番に表示
For Each s In strLinkList
    MessageBox.Show(s)
Next

Stackクラス

先入れ後出しのクラスです。

Dim intStack = New Stack(Of Integer)

'要素を追加
intStack.Push(100)
intStack.Push(200)
intStack.Push(300)

'先頭の要素を取得して削除
Dim v1 As Integer = intStack.Pop()

'先頭の要素を取得(削除しません)
Dim v2 As Integer = intStack.Peek()

'要素を全て削除
intStack.Clear()

Queueクラス

先入れ先出しのクラスです。

Dim intQueue = New Queue(Of Integer)

'要素を追加
intQueue.Enqueue(100)
intQueue.Enqueue(200)
intQueue.Enqueue(300)

'先頭の要素を取得して削除
Dim q1 As Integer = intQueue.Dequeue()

'先頭の要素を取得
Dim q2 As Integer = intQueue.Peek()

'すべての要素の削除
intQueue.Clear()