ExcelでのSortedListについてのプロパティーとメソッドの一覧表が見つからなかったのでとり合えずMSDN http://msdn.microsoft.com/ja-jp/library/system.collections.sortedlist.aspx#Y0 にあるVBの表をコピーしておきました。大体Excelで使用できるようです。

1.プロパティー

主なプロパティー

名前説明
CapacitySortedList オブジェクトの容量を取得または設定します。
CountSortedList オブジェクトに格納されている要素の数を取得します。
IsFixedSize*SortedList オブジェクトが固定サイズかどうかを示す値を取得します。
IsReadOnly*SortedList オブジェクトが読み取り専用かどうかを示す値を取得します。
IsSynchronized*SortedList オブジェクトへのアクセスが同期されている (スレッド セーフである) かどうかを示す値を取得します。
Item*SortedList オブジェクト内の特定のキーに関連付けられている値を取得または設定します。
Keys*SortedList オブジェクト内のキーを取得します。
SyncRoot*SortedList オブジェクトへのアクセスを同期するために使用できるオブジェクトを取得します。
Values*SortedList オブジェクト内の値を取得します。

2.メソッド

主なメソッド

名前説明
Add指定したキーおよび値を持つ要素を SortedList オブジェクトに追加します。
ClearSortedList オブジェクトからすべての要素を削除します。
CloneSortedList オブジェクトの簡易コピーを作成します。
ContainsSortedList オブジェクトに特定のキーが格納されているかどうかを確認します。
ContainsKeySortedList オブジェクトに特定のキーが格納されているかどうかを確認します。Contains同じのようです。
ContainsValueSortedList オブジェクトに特定の値が格納されているかどうかを確認します。
CopyToSortedList の要素を 1 次元の Array オブジェクトにコピーします。コピー操作は、配列内の指定したインデックスから始まります。
Equals(Object)*指定した Object が、現在の Object と等しいかどうかを判断します。 (Object から継承されます。)
Finalize*オブジェクトがガベージ コレクションにより収集される前に、そのオブジェクトがリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。)
GetByIndex*SortedList オブジェクトの指定したインデックスにある値を取得します。
GetEnumerator*SortedList オブジェクトを反復処理する IDictionaryEnumerator オブジェクトを返します。
GetHashCode*特定の型のハッシュ関数として機能します。 (Object から継承されます。)
GetKeySortedList オブジェクトの指定したインデックスにあるキーを取得します。
GetKeyList*SortedList オブジェクト内のキーを取得します。
GetType*現在のインスタンスの Type を取得します。 (Object から継承されます。)
GetValueList*SortedList オブジェクト内の値を取得します。
IndexOfKey*SortedList オブジェクト内の指定したキーの、0 から始まるインデックス番号を返します。
IndexOfValue*SortedList オブジェクト内にある指定した値のうち、最初に出現する値の、0 から始まるインデックス番号を返します。
MemberwiseClone*現在の Object の簡易コピーを作成します。 (Object から継承されます。)
Remove指定したキーを持つ要素を SortedList オブジェクトから削除します。
RemoveAt*SortedList オブジェクトの指定したインデックスにある要素を削除します。
SetByIndex*SortedList オブジェクトの特定のインデックスにある値を置換します。
SynchronizedSortedList オブジェクト用の同期された (スレッド セーフな) ラッパーを返します。
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. ) 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
    
  2. ) 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
    
  3. ) 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
    
  4. ) 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
    

最終更新のRSS
Last-modified: 2014-03-11 (火) 01:58:42 (3699d)