忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

VB:NET:ArrayList と Hashtable の合体クラス
VB.NETには「コレクション」としてのArrayList、Hashtable、SortedListなどの、各種のデータを配列の様に扱えるクラスが標準で備わっています。
クラスキー指標概要
ArrayList × 指標のみ扱いができる。(通常の配列の様である)
Hashtable × キーのみ扱いができる。
SortedList ArrayListとHashtableを合体した感じであるが、指標の扱いはキーでソートされた結果である。
SortedListは使いやすそうですが、キーでソートされてしまうので、ソートがされないSortedList的なクラスがあればと思い ArrayListとHashtableを合体させた、clsArrayHashなるクラスを作成してみました。

クラス全体のソースは最後に載せますが、このクラスの使い方を先ずは見てください。
あるフォームにボタンを配置し、そのクリックでテストを行っています。
clsArrayHashに追加されるデータは文字列を使った簡単なもので、データの順次取得に、ForEachと指標を使った2つの方法を示しています。


■「clsArrayHash」の使用テストソース1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    'ArrayHashクラスの生成
    Dim clsList As New clsArrayHash

    '仮のデータを3件追加
    clsList.Add("key1", "key1-contents")
    clsList.Add("key2", "key2-contents")
    clsList.Add("key3", "key3-contents")

    'ArrayHashクラスから順次データを取得
    Dim strSum As String = ""
    For Each str As String In clsList
        strSum &= str & " : "
    Next
    MsgBox(strSum)

    'ArrayHashクラスから指標を用いて順次データを取得
    strSum = ""
    For i = 0 To clsList.Count - 1
        strSum &= clsList(i) & " : "
    Next
    MsgBox(strSum)

    'ArrayHashクラスクリア
    clsList.Clear()
    clsList = Nothing
End Sub
次に、更にフォームにボタンを配置し、そのクリックでテストを行っています。
clsArrayHashに追加されるデータはテスト的なクラスを使った簡単なもので、データの順次取得に、ForEachと指標を使った2つの方法を示しています。
■「clsArrayHash」の使用テストソース2
'テストクラス
Private Class clsSub
    Public strData1 As String
    Public strData2 As String

    'コンストラクタ
    Sub New(ByVal strData1 As String, ByVal strData2 As String)
        Me.strData1 = strData1
        Me.strData2 = strData2
    End Sub
End Class

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    'ArrayHashクラスの生成
    Dim clsList As New clsArrayHash

    '仮のデータを3件追加
    clsList.Add("key1", New clsSub("key1-Data1", "key1-Data2"))
    clsList.Add("key2", New clsSub("key2-Data1", "key2-Data2"))
    clsList.Add("key3", New clsSub("key3-Data1", "key3-Data2"))

    'ArrayHashクラスから順次データを取得
    Dim strSum As String = ""
    For Each cls As clsSub In clsList
        strSum &= cls.strData1 & "," & cls.strData2 & " : "
    Next
    MsgBox(strSum)

    'ArrayHashクラスから指標を用いて順次データを取得
    strSum = ""
    For i = 0 To clsList.Count - 1
        Dim cls As clsSub = clsList(i)
        strSum &= cls.strData1 & "," & cls.strData2 & " : "
    Next
    MsgBox(strSum)

    'ArrayHashクラスクリア
    clsList.Clear()
    clsList = Nothing
End Sub
以下に、clsArrayHashの全体のソースを載せます。バグがあるかもしれませんが悪しからず。 ■「clsArrayHash」のソース
'''------------------------------------------------------------------------
''' 
''' ArrayListとHashtableの合体クラス
''' 
''' 
'''------------------------------------------------------------------------
Public Class clsArrayHash
    Implements IEnumerable

    Private arrayList As ArrayList
    Private hashTable As Hashtable

    '''------------------------------------------------------------------------
    ''' 
    ''' コンストラクタ
    ''' 
    '''------------------------------------------------------------------------
    Sub New()
        Me.arrayList = New ArrayList
        Me.hashTable = New Hashtable
    End Sub

    '''------------------------------------------------------------------------
    ''' 
    ''' 指定したキーおよび値を持つ要素を ArrayHashに追加します。
    ''' 
    '''追加する要素のキー。
    '''追加する要素の値。
    ''' value が追加された位置の ArrayHash インデックス。
    '''------------------------------------------------------------------------
    Public Function Add(ByVal key As String, ByVal value As Object) As Integer
        'ArrayListへの追加位置
        Dim listPos As Integer = -1

        'ハッシュテーブルのキーの存在チェック
        If Me.hashTable.ContainsKey(key) = False Then
            'ArrayListへの追加
            listPos = Me.arrayList.Add(value)
            'ハッシュテーブルへArrayListのIndexを追加
            hashTable.Add(key, listPos)
        End If
        'ArrayListへの追加位置を返す
        Return listPos
    End Function

    '''------------------------------------------------------------------------
    ''' 
    ''' 指定したキーに関連付けられている値を取得または設定します。
    ''' 
    '''値を取得または設定する対象のキー。
    ''' 設定値
    ''' 指定したキーに関連付けられている値。指定したキーが見つからない場合、Nothingが返ります。
    '''------------------------------------------------------------------------
    Default Public Property Item(ByVal key As String) As Object
        Get
            'ハッシュテーブルのキーの存在チェック
            If Me.hashTable.ContainsKey(key) = True Then
                '存在した場合、ArrayListのIndex取得
                Dim i As Integer = Me.hashTable(key)
                Return Me.arrayList(i)
            Else
                '存在しない場合、Nothingを返す
                Return Nothing
            End If
        End Get
        Set(ByVal value As Object)
            'ハッシュテーブルのキーの存在チェック
            If Me.hashTable.ContainsKey(key) = True Then
                '存在した場合、ArrayListのIndex取得
                Dim i As Integer = Me.hashTable(key)
                'ArrayListへオブジェクトの設定
                Me.arrayList(i) = value
            End If
        End Set
    End Property

    '''------------------------------------------------------------------------
    ''' 
    ''' 指定したインデックスにある要素を取得または設定します。
    ''' 
    '''取得または設定する要素の、0 から始まるインデックス番号。
    ''' 設定する要素。
    ''' 指定したインデックスにある要素。
    '''------------------------------------------------------------------------
    Default Public Property Item(ByVal idx As Integer) As Object
        Get
            If 0 <= idx And idx <= Me.arrayList.Count - 1 Then
                '指標の範囲が正常の場合、ArrayListの内容を返す
                Return Me.arrayList(idx)
            Else
                '指標の範囲がエラーの場合、Nothingを返す
                Return Nothing
            End If
        End Get
        Set(ByVal value As Object)
            If 0 <= idx And idx <= Me.arrayList.Count - 1 Then
                '指標の範囲が正常の場合、ArrayListへオブジェクトの設定
                Me.arrayList(idx) = value
            End If
        End Set
    End Property

    '''------------------------------------------------------------------------
    ''' 
    ''' ArrayHash に実際に格納されている要素の数を取得します。
    ''' 
    ''' ArrayHash に実際に格納されている要素の数
    '''------------------------------------------------------------------------
    Public ReadOnly Property Count() As Integer
        Get
            Return Me.arrayList.Count
        End Get
    End Property

    '''------------------------------------------------------------------------
    ''' 
    ''' ArrayHash からすべての要素を削除します。
    ''' 
    '''------------------------------------------------------------------------
    Public Sub Clear()
        Me.arrayList.Clear()
        Me.hashTable.Clear()
    End Sub

    '''------------------------------------------------------------------------
    ''' 
    ''' ArrayHash に特定のキーが格納されているかどうかを判断します。
    ''' 
    '''ArrayHash 内で検索されるキー。
    ''' 指定したキーを持つ要素が ArrayHash に格納されている場合は true。それ以外の場合は false。
    '''------------------------------------------------------------------------
    Public Function ContainsKey(ByVal key As String) As Boolean
        '内部のハッシュテーブルを利用
        Return Me.hashTable.ContainsKey(key)
    End Function

    '''------------------------------------------------------------------------
    ''' 
    ''' IEnumerable.GetEnumerator()の実装
    ''' 
    ''' 
    '''------------------------------------------------------------------------
    Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
        'arrayList型のGetEnumerator()を流用する
        Return Me.arrayList.GetEnumerator()
    End Function

End Class
=====
2015/03/16:の時の情報











PR

コメント

コメントを書く