1つ目は、Dictionaryの内容を、KeyValuePairのリストに変えてからソートする方法です。
| Dictionary<string, int> | |
| "Bob" | 3 |
| "Dave" | 1 |
| "Alice" | 2 |
| "Charlie" | 5 |
| "Eve" | 4 |
→ 変換 →
| List<KeyValuePair<string, int>> | |
| {"Bob", 3} | |
| {"Dave", 1} | |
| {"Alice", 2} | |
| {"Charlie", 5} | |
| {"Eve", 4} | |
→ ソート →
| List<KeyValuePair<string, int>> | |
| {"Alice", 2} | |
| {"Bob", 3} | |
| {"Charlie", 5} | |
| {"Dave", 1} | |
| {"Eve", 4} | |
KeyValuePairはDictionaryの内部で使われている構造体で、キーと値のペアを一つの構造体として格納するためのものです。 Dictionaryを直接列挙する場合などにも使われます。 DictionaryをこのKeyValuePairのリストに変換してから、List.Sortメソッドを使ってソートします。
ただし、ただ単にKeyValuePairをソートしようとしてもKeyValuePairはそのソート方法が定義されていないため、List.SortメソッドはInvalidOperationExceptionをスローします。 このため、KeyValuePairのソート方法(比較方法)を定義したメソッドを別途用意し、ソートする際にList.Sortメソッドに渡す必要があります。
この方法によるソートの具体例は次のようになります。 この例におけるCompareKeyValuePairメソッドが、KeyValuePairのソート方法(比較方法)を定義するメソッドです。
using System;
using System.Collections.Generic;
class Sample {
// 二つのKeyValuePair<string, int>を比較するためのメソッド
static int CompareKeyValuePair(KeyValuePair<string, int> x, KeyValuePair<string, int> y)
{
// Keyで比較した結果を返す
return string.Compare(x.Key, y.Key);
}
static void Main()
{
// ソート対象のDictionary<string, int>
var dict = new Dictionary<string, int>();
dict.Add("Bob", 3);
dict.Add("Dave", 1);
dict.Add("Alice", 2);
dict.Add("Charlie", 5);
dict.Add("Eve", 4);
// Dictionaryの内容をコピーして、List<KeyValuePair<string, int>>に変換
var pairs = new List<KeyValuePair<string, int>>(dict);
// List.Sortメソッドを使ってソート
// (引数に比較方法を定義したメソッドを指定する)
pairs.Sort(CompareKeyValuePair);
foreach (var pair in pairs) {
Console.WriteLine("{0} {1}", pair.Key, pair.Value);
}
}
}
Alice 2 Bob 3 Charlie 5 Dave 1 Eve 4
List.Sortメソッドは、CompareKeyValuePairメソッドで定義されている比較処理にしたがってソートを行います。 上記の例ではキーを比較したため、Dictionaryはキーを基準にソートされました。 比較方法の定義を変えればソートの順序を変更することもできます。 例えば、CompareKeyValuePairを次のように変更することにより、Dictionaryを値でソートできるようになります。
List.Sortメソッドと比較方法の定義(Comparison<T>デリゲート)については、複合型のソート・複数キーでのソートで詳しく解説します。