【C#】Dictionary をソートして出力する3つの方法

【C#】Dictionaryをソートして出力する3つの方法

C# において、Dictionary はキーと値のペアを格納するデータ構造としてよく使われます。しかし、Dictionary のキーをソートすることは直接できず、ソートされた結果を取得するにはいくつかの方法があります。

本記事では、LINQ や SortedDictionary などを使って Dictionary をソートするための3つの方法を紹介します。

Dictionary をソートして出力する3つの方法

1. キーをリストに変換してソートする方法

Dictionary のキーをリストに変換して、リストをソートする方法です。

以下のサンプルコードでは、Dictionary のキーを List に変換し、List をソートしています。

using System;
using System.Collections.Generic;

public class Sample
{
    public static void Main()
    {
        var dict = new Dictionary<int, string>()
        {
            { 2, "banana" },
            { 3, "apple" },
            { 1, "orange" }
        };
        
        var sortedKeys = new List<int>(dict.Keys);
        // 配列を昇順ソート
        sortedKeys.Sort();
        
        foreach (var key in sortedKeys)
        {
            Console.WriteLine("{0}: {1}", key, dict[key]);
        }
    }
}

出力結果

1: orange
2: banana
3: apple

降順ソートがしたい場合は、 Array.Sortの後に Array.Reverseを実行することで実現可能です。

var sortedKeys = new List<int>(dict.Keys);

// 配列を昇順ソート
Array.Sort(sortedKeys);
// 配列の順序を反転させる
Array.Reverse(sortedKeys);

出力結果

3: apple
2: banana
1: orange

2. LINQ を使用してソートする方法

Dictionary のキーをソートするもう1つの方法は、LINQ を使用する方法です。

以下のサンプルコードでは、Dictionary のキーを OrderBy メソッドを使用して昇順ソートしています。

using System;
using System.Collections.Generic;
using System.Linq;

public class Sample
{
    public static void Main()
    {
        var dict = new Dictionary<int, string>()
        {
            { 3, "apple" },
            { 2, "banana" },
            { 1, "orange" }
        };
        
        foreach (var key in dict.Keys.OrderBy(x => x))
        {
            Console.WriteLine("{0}: {1}", key, dict[key]);
        }
    }
}

出力結果

1: orange
2: banana
3: apple

降順ソートがしたい場合は、 OrderByDescending を使用します。

foreach (var key in dict.Keys.OrderByDescending(x => x))
{
    Console.WriteLine("{0}: {1}", key, dict[key]);
}

出力結果

3: apple
2: banana
1: orange

3. SortedDictionary を使ったソート方法

SortedDictionary は、Dictionary を自動的にソートしてくれる便利なクラスです。

通常の Dictionary と同様に一意のキーで要素にアクセスできますが、SortedDictionary はキーのソート順にアクセスできます。SortedDictionary は、通常の Dictionary と同様にO(1)の時間での挿入、削除、検索が可能ですが、SortedDictionary では追加された要素はソートされた状態に保たれます。

SortedDictionary を使用する場合、追加された要素は自動的にソートされるため、要素を取り出すときにはキーの昇順または降順でアクセスすることができます。SortedDictionary は通常、要素をキーのソート順に並べ替えたい場合に使用されます。

以下は、SortedDictionary を使用する簡単な例です。

using System;
using System.Collections.Generic;

public class Sample
{
    public static void Main()
    {
        // SortedDictionary の宣言
        SortedDictionary<int, string> dictionary = new SortedDictionary<int, string>();
        
        // キーと値の追加
        dictionary.Add(3, "apple");
        dictionary.Add(2, "banana");
        dictionary.Add(1, "orange");
        
        // キーでソートされた順序で要素にアクセス
        foreach (var item in dictionary)
        {
            Console.WriteLine(item.Key + ": " + item.Value);
        }
    }
}

出力結果

1: orange
2: banana
3: apple

おわりに

以上、C #の Dictionary をソートする3つの方法を紹介しました。

Dictionary は非常に便利なデータ構造であり、キーに対応する値を素早く検索できます。

特に大規模なデータセットを扱う場合、効率的なソートアルゴリズムを使用することが重要です。また、Linq を使った方法はコードが短く簡潔に書けるため、小規模なデータセットに対しては有効です。

上記の方法を参考にして、自分のアプリケーションで Dictionary をソートしてみてください。

参考リンク