VB.NETには「コレクション」としてのArrayList、Hashtable、SortedListなどの、各種のデータを配列の様に扱えるクラスが標準で備わっています。
SortedListは使いやすそうですが、キーでソートされてしまうので、ソートがされないSortedList的なクラスがあればと思い ArrayListとHashtableを合体させた、clsArrayHashなるクラスを作成してみました。
クラス全体のソースは最後に載せますが、このクラスの使い方を先ずは見てください。
あるフォームにボタンを配置し、そのクリックでテストを行っています。
clsArrayHashに追加されるデータは文字列を使った簡単なもので、データの順次取得に、ForEachと指標を使った2つの方法を示しています。
■「clsArrayHash」の使用テストソース1
clsArrayHashに追加されるデータはテスト的なクラスを使った簡単なもので、データの順次取得に、ForEachと指標を使った2つの方法を示しています。
■「clsArrayHash」の使用テストソース2
2015/03/16:の時の情報
クラス | キー | 指標 | 概要 |
---|---|---|---|
ArrayList |
× | ○ | 指標のみ扱いができる。(通常の配列の様である) |
Hashtable |
○ | × | キーのみ扱いができる。 |
SortedList |
○ | ○ | ArrayListとHashtableを合体した感じであるが、指標の扱いはキーでソートされた結果である。 |
クラス全体のソースは最後に載せますが、このクラスの使い方を先ずは見てください。
あるフォームにボタンを配置し、そのクリックでテストを行っています。
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
コメント