Dictionary を key 順にソートしたくて、調べていると SortedDictionary
というものがあるみたいでした
使い方
例えばこのようにすると foreach で取得する際にはソートされて取得できます
var sortedDictionary = new SortedDictionary<int, string>(); sortedDictionary.Add(2, "2"); sortedDictionary.Add(1, "1"); // 1, 2 foreach (var pair in _sortedDictionary) { Debug.Log(pair.Key); }
ソート順
IComparer
を継承したクラスを SortedDictionary
のインスタンス作成時にわたすことでソート順を指定できます
private class SortedDictionaryComparer : IComparer<int> { public int Compare(int x, int y) { return y - x; } } private void Main() { var sortedDictionary = new SortedDictionary<int, string>(new SortedDictionaryComparer()); for (int i = 0; i < 10; i++) { sortedDictionary.Add(i, i.ToString()); } foreach (var pair in sortedDictionary) { Debug.Log(pair.Key); } }
速度
しかし ソートするのは foreach をする際らしいので Dictionary
との速度を比較してみました
var sortedDictionary = new SortedDictionary<int, string>(); var dictionary = new Dictionary<int, string>(); for (int i = 100000; i >= 0; i--) { dictionary.Add(i, i.ToString()); sortedDictionary.Add(i, i.ToString()); } using (new ProfilingSampleScope("Profile SortedDictionary")) foreach (var pair in sortedDictionary) ; using (new ProfilingSampleScope("Profile Dictionary")) foreach (var pair in dictionary) ;
結果は想定通りSortedDictionary
のほうが5倍ほど時間がかかるようでした
ms かつ10万件のデータでの計測なので、そこまで気にはならないと思いますが
通常より遅くなるということは留意したほうがいいかもしれません