うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【C#】Dictionary をソートする

Dictionary を key 順にソートしたくて、調べていると SortedDictionary というものがあるみたいでした

docs.microsoft.com

使い方

例えばこのようにすると 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万件のデータでの計測なので、そこまで気にはならないと思いますが
通常より遅くなるということは留意したほうがいいかもしれません

f:id:hacchi_man:20200619044339p:plain