ここでは非ジェネリックなコレクション型System.Collections.SortedListクラスについて解説します。 SortedListクラスを使用するよりも、SortedListに相当するジェネリックなコレクション型System.Collections.Generic.SortedList<T>クラスを使用することを強く推奨します。
SortedList
System.Collections.SortedListクラスは、HashtableクラスとArrayListクラスの両方の特徴を持ったコレクションです。 Hashtableと同じようにキーと値のペアで要素が格納され、キーによってコレクション内の要素にアクセスできるという点に加え、ArrayListのようにインデックスを指定して要素にアクセスすることができます。 また、SortedListという名前が示すとおり、要素が追加される時点でSortedListの内容はキーに基づいてソートされる点でHashtableと異なります。
基本的な操作
多くの操作はHashtableと同様ですが、SortedListを使った例によって基本的な操作について見ていきます。
例で示したとおり、キーによるアクセスの場合はHashtableと同様にインデクサを用いて行い、インデックスによるアクセスの場合はGetByIndexメソッドとSetByIndexメソッドを用いて行います。 インデクサにインデックスを指定しても、キーとしてしか扱われないので注意してください。
また、キーに該当する要素のインデックス、値に該当する要素のインデックスを取得するには、IndexOfKeyメソッドとIndexOfValueメソッドを使います。 該当するキーまたは値が見つからない場合は-1が返されます。
この例では使用していませんが、キーによる要素の削除にはRemoveメソッド、インデックスによる要素の削除にはRemoveAtメソッドを使用します。 Hashtableと同様、ContainsKeyメソッド、ContainsValueメソッドも用意されています。
列挙操作
SortedListの列挙もHashtableでの列挙と同様、DictionaryEntryに格納たキーと値のペアで列挙されますが、ソート済みの状態で列挙される点がHashtableとは異なります。 また、Hashtableと同様に、SortedListに格納されているすべてのキーはKeysプロパティ、値はValuesプロパティを通して参照できます。
同じ内容のSortedListとHashtableを列挙していますが、SortedListの場合はキーによってソートされている点に注目してください。
ソート順のカスタマイズ
コンストラクタで適切なIComparerインターフェイスを指定することで、SortedListのキー比較時の動作をカスタマイズ出来ます。 HashtableではIEqualityComparerインターフェイスを用いてキーの同一性の比較のみを行いますが、SortedListではIComparerインターフェイスを使ってキーの同一性の比較と並べ替えを行います。 以下は、アルファベット順とは逆順(Z-Aの順)になるようにソートするIComparerを実装し、SortedListでの並べ替え順をカスタマイズする例です。