1.プロパティー †
主なプロパティー
名前 | 説明 |
Capacity | SortedList オブジェクトの容量を取得または設定します。 |
Count | SortedList オブジェクトに格納されている要素の数を取得します。 |
IsFixedSize* | SortedList オブジェクトが固定サイズかどうかを示す値を取得します。 |
IsReadOnly* | SortedList オブジェクトが読み取り専用かどうかを示す値を取得します。 |
IsSynchronized* | SortedList オブジェクトへのアクセスが同期されている (スレッド セーフである) かどうかを示す値を取得します。 |
Item* | SortedList オブジェクト内の特定のキーに関連付けられている値を取得または設定します。 |
Keys* | SortedList オブジェクト内のキーを取得します。 |
SyncRoot* | SortedList オブジェクトへのアクセスを同期するために使用できるオブジェクトを取得します。 |
Values* | SortedList オブジェクト内の値を取得します。 |
2.メソッド †
主なメソッド
名前 | 説明 |
Add | 指定したキーおよび値を持つ要素を SortedList オブジェクトに追加します。 |
Clear | SortedList オブジェクトからすべての要素を削除します。 |
Clone | SortedList オブジェクトの簡易コピーを作成します。 |
Contains | SortedList オブジェクトに特定のキーが格納されているかどうかを確認します。 |
ContainsKey | SortedList オブジェクトに特定のキーが格納されているかどうかを確認します。Contains同じのようです。 |
ContainsValue | SortedList オブジェクトに特定の値が格納されているかどうかを確認します。 |
CopyTo | SortedList の要素を 1 次元の Array オブジェクトにコピーします。コピー操作は、配列内の指定したインデックスから始まります。 |
Equals(Object)* | 指定した Object が、現在の Object と等しいかどうかを判断します。 (Object から継承されます。) |
Finalize* | オブジェクトがガベージ コレクションにより収集される前に、そのオブジェクトがリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。) |
GetByIndex* | SortedList オブジェクトの指定したインデックスにある値を取得します。 |
GetEnumerator* | SortedList オブジェクトを反復処理する IDictionaryEnumerator オブジェクトを返します。 |
GetHashCode* | 特定の型のハッシュ関数として機能します。 (Object から継承されます。) |
GetKey | SortedList オブジェクトの指定したインデックスにあるキーを取得します。 |
GetKeyList* | SortedList オブジェクト内のキーを取得します。 |
GetType* | 現在のインスタンスの Type を取得します。 (Object から継承されます。) |
GetValueList* | SortedList オブジェクト内の値を取得します。 |
IndexOfKey* | SortedList オブジェクト内の指定したキーの、0 から始まるインデックス番号を返します。 |
IndexOfValue* | SortedList オブジェクト内にある指定した値のうち、最初に出現する値の、0 から始まるインデックス番号を返します。 |
MemberwiseClone* | 現在の Object の簡易コピーを作成します。 (Object から継承されます。) |
Remove | 指定したキーを持つ要素を SortedList オブジェクトから削除します。 |
RemoveAt* | SortedList オブジェクトの指定したインデックスにある要素を削除します。 |
SetByIndex* | SortedList オブジェクトの特定のインデックスにある値を置換します。 |
Synchronized | SortedList オブジェクト用の同期された (スレッド セーフな) ラッパーを返します。 |
ToString* | 現在のオブジェクトを表す文字列を返します。 (Object から継承されます。) |
TrimToSize* | 容量を SortedList オブジェクト内にある実際の要素数に設定します。 |
3.拡張メソッド †
名前 | 説明 |
AsParallel* | クエリの並列化を有効にします。 (ParallelEnumerable によって定義されています。) |
AsQueryable* | IEnumerable を IQueryable に変換します。 (Queryable によって定義されています。) |
Cast(Of TResult)* | IEnumerable の要素を、指定した型に変換します。 (Enumerable によって定義されています。) |
OfType(Of TResult)* | 指定された型に基づいて IEnumerable の要素をフィルター処理します。 (Enumerable によって定義されています。) |
4.参照設定 †
SortedListを使用するには、次のライブラリーの参照設定が必要です。
mscorlib.dll
参照設定参照。
5.ArrayListとの相違 †
SortedListとArrayListは入れ物を配列として追加・削除が出来るクラスです。ここで入れ物と呼んでいる理由は、普通の配列であれば入れるものがInteger、Stringなど宣言した時の一種類のデータ型のデータしか入れることが出来ません。しかし、SortedListとArrayListはどんなデータ型のデータでも入れることが出来ます。そのため、SortedList(親)の配列にSortedList(子)を入れ、そのSortedList(子)にSortedList(孫)を入れるなど階層的にデータを構成することが出来ます。
またクラスと呼んでいる理由は、使用する場合New関数によりオブジェクト(実体・インスタンス)を作成しなければなりません。オブジェクトはA=Bのように直接代入するのではなくSetステートメントでSet A = Bというように参照を与えます。また、メソッドやプロパティーなどがあり普通の配列に比べ便利です。
さて本題ですがArryListは入れ物を配列として持つだけです。データの順番はデータを入れた順番になり、データの操作は添字を使用します。
一方SortedListはキー + データの一対でデータを配列として持ちArryListにキーを追加したものです。しかし単にキーが追加されたものではなく、データを操作する場合はキーやインデックスを使用して操作し、一旦追加されたデータはもはやデータを追加した順番で操作できません。インデックスはキーでソートした順番です。名前の通り、データはキーでソートされ、キーでユニーク管理されます。小生の場合は、ソートよりはもっぱらユニーク管理の目的で使用します。それは文字列の2よりは11の方が先になるとか漢字のソートにあまり意味がないと思われるためです。ソートの性質をよく理解してから利用して下さい。一方ユニーク管理の場合は、同じキーのデータをまとめる(例えば住所で都道府県別にまとめる)のに便利で、前述のようにキーを多重化し階層化してまとめることもできます。
6.サンプル †
データベースからSQLのSELECT文でデータを取得したときにデータをまとめる例を紹介します。以下の幾つかのサンプル使用例はDBの章にあります。
- ) 1項目をキーとしてデータをArrayListに蓄積します。SortedListが1段階でSortedList(key) → ArrayList(i)の構成です。
Sub Exec_Select2List(conn As ADODB.Connection, strSelectSQL As String, _
sList As SortedList, msg As String)
Dim adoRs As ADODB.Recordset
Dim i As Integer
Dim obj As ArrayList
Dim key As String
On Error GoTo Err_Handler
Set adoRs = conn.Execute(strSelectSQL)
If Not adoRs.EOF Then
adoRs.MoveFirst '←これは無くてもよい
Do Until adoRs.EOF
key = Trim(CStr(adoRs(0).Value))
If Not sList.Contains(key) Then
sList.Add key, New ArrayList
Else
'NOP
End If
Set obj = sList(key)
For i = 1 To adoRs.Fields.Count - 1
obj.Add Trim(CStr(adoRs(i).Value))
'ここで単にobj.Add adoRs(i)とするとobjのデータ型がArrayListなので
'adoRs(i)を参照として保持してしまいます。
'そのためこのプロシージャを抜けてadoRsが無効になった段階でデータが
'参照できなくなり、アクセスするとエラーになります。
'adoRs(i).Valueとするか、CStr(adoRs(i))として実体化させる必要があります。
Next i
adoRs.MoveNext
Loop
Set obj = Nothing
Else
If msg <> "" Then
ErrMessage_Set msg
End If
End If
Sub_DB_RS_Close adoRs
Exit Sub
Err_Handler:
MsgBox "ErrNo: " & Err.Number & " : " & Err.Description
DB_End adoRs 'DB_EndはDBの章を参照のこと
Set obj = Nothing
End Sub
- ) 1項目と2項目をキーとしてデータをArrayListに蓄積します。SortedListが2段階でSortedList(key) → SortedList(key2) → ArrayList(i)の構成です。
Sub Exec_Select2ListSubKey(conn As ADODB.Connection, strSelectSQL As String, _
sList As SortedList, msg As String)
Dim adoRs As ADODB.Recordset
Dim temp As String
Dim i As Integer
Dim objList As SortedList
Dim obj As ArrayList
Dim key As String
Dim key2 As String
Dim keyObj As String
On Error GoTo Err_Handler
Set adoRs = conn.Execute(strSelectSQL)
If Not rs.EOF Then
adoRs.MoveFirst
Do Until adoRs.EOF
key = Trim(CStr(adoRs(0).Value))
If Not sList.Contains(key) Then
sList.Add key, New SortedList
Else
'NOP
End If
Set objList = sList(key)
key2 = Trim(CStr(adoRs(1).Value))
If Not objList.Contains(key2) Then
objList.Add key2, New ArrayList
Else
'NOP
End If
Set obj = objList(key2)
For i = 2 To adoRs.Fields.Count - 1
obj.Add Trim(CStr(adoRs(i).Value))
Next i
adoRs.MoveNext
Loop
Set obj = Nothing
Set objList = Nothing
Else
If msg <> "" Then
ErrMessage_Set msg
End If
End If
Sub_DB_RS_Close adoRs
Exit Sub
Err_Handler:
MsgBox "ErrNo: " & Err.Number & " : " & Err.Description
DB_End adoRs
Set obj = Nothing
Set objList = Nothing
End Sub
- ) SortedListの全データをイミディエイトウィンドウに表示させるデバッグ用のプロシージャです。(SortedList(key) → ArrayList)
Sub SortedList_Debug(sList As SortedList)
Dim work As String
Dim obj As ArrayList
Dim i As Integer
Dim j As Integer
For i = 0 To sList.Count - 1
work = "1stKey[" & sList.GetKey(i) & "] "
Set obj = sList.GetByIndex(i) '← sList(key)でも可
For j = 0 To obj.Count - 1
work = work & "[" & obj(j) & "]"
Next j
Set obj = Nothing
Debug.Print work
Next i
End Sub
- ) 2階層構造のSortedListの全データをイミディエイトウィンドウに表示させるデバッグ用のプロシージャです。(SortedList(key) → SortedList(key2) → ArrayList)
Sub SortedListSubKey_Debug(sList As SortedList)
Dim key As String
Dim work As String
Dim objList As SortedList
Dim obj As ArrayList
Dim i As Integer
Dim j As Integer
Dim k As Integer
For i = 0 To sList.Count - 1
key = sList.GetKey(i)
Set objList = sList.GetByIndex(i)
For j = 0 To objList.Count - 1
work = "2ndKey[" & objList.GetKey(j) & "]"
Set obj = objList.GetByIndex(j)
For k = 0 To obj.Count - 1
work = work & "[" & obj(k) & "]"
Next k
Debug.Print "1stKey[" & key & "] " & work
Set obj = Nothing
Next j
Set objList = Nothing
Next i
End Sub