C# で辞書をキーで並べ替える

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. OrderBy() LINQ メソッドを使用して、C# で辞書をキーで並べ替える
  2. C#SortedList<TKey, TValue> クラスを使用して辞書をキーで並べ替える
  3. C#SortedDictionary<TKey, TValue> クラスを使用して辞書をキーで並べ替える
C# で辞書をキーで並べ替える

C# では、ディクショナリは ハッシュ テーブル としての実装を反映したほぼ一定時間のルックアップを可能にします。つまり、ディクショナリは本質的にソートされていません。 辞書には事前定義された並べ替え方法がないため、辞書の要素を個別に取得して並べ替えることができます。

最初の方法は、OrderBy() LINQ メソッドを使用することです。 ただし、すべてのエントリをソートする必要があるため、最高のパフォーマンス O(n*log(n)) はありません。 キーによって辞書要素に繰り返しアクセスする必要がある場合は、SortedList または SortedDictionary を使用してください。これらは、品質を損なうことなくこの目的を達成するのに役立ちます。

要素のリストを線形時間 O(n) で順番に抽出すると、ルックアップ時間と挿入時間のパフォーマンスが低下する可能性があります。 このチュートリアルでは、C# で辞書をキーで並べ替える 3つの方法を学習します。

OrderBy() LINQ メソッドを使用して、C# で辞書をキーで並べ替える

この LINQ メソッドを使用すると、プログラマは辞書から KeyValuePartsIOrderedEnumerable を抽出して、そのキーで並べ替えることができます。 辞書は要素を順番に格納できないため、辞書のソートは O(n*log(n)) になります。

LINQ メソッドは System.Linq 名前空間に属しており、並べ替えられた辞書内の各キーのすべてのキーと値のペアを簡単に処理できます。 OrderBy メソッドは遅延実行によって実装され、辞書の並べ替えに必要なすべての情報を格納するオブジェクトをすぐに返します。

安定ソートを実行し、2つの要素のキーが等しい場合、要素の順序は保持されます。

コード例:

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

public class sortOrderBy {
  public static void Main(string[] args) {
    var metal = new Dictionary<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    foreach (var console in metal.OrderBy(x => x.Key)) {
      Console.WriteLine(console);
    }
  }
}

出力:

[Aluminum, 4]
[Platinum, 7]
[Titanium, 3]

OrderBy に代わる LINQ メソッドは OrderByDesending です。これは、その名前が示すように、順序を逆にします。 IOrderedEnumerable<TElement> の型であるため、ThenBy および ThenByDescending メソッドを使用すると、追加の並べ替え条件を指定して辞書を並べ替えることができます。

さらに、LINQ Reverse メソッドは、辞書を降順で並べ替える OrderByDescending メソッドと同等です。

コード例:

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

public class sortOrderByDescending {
  public static void Main(string[] args) {
    var metal = new Dictionary<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    // LINQ `Reverse` method, which gives the similar output
    /*
    foreach (var item in fruit.Reverse())
    {
        Console.WriteLine(console);
    }
    */

    foreach (var console in metal.OrderByDescending(x => x.Key)) {
      Console.WriteLine(console);
    }
  }
}

出力:

[Titanium, 3]
[Platinum, 7]
[Aluminum, 4]

C#SortedList<TKey, TValue> クラスを使用して辞書をキーで並べ替える

このメソッドまたはデータ構造はキーをその値にマップし、辞書のように機能する可能性があるため、その名前は誤解を招く可能性があります。 バイナリ検索アプローチを使用してキーで値を検索し、それらを特定の順序で格納して辞書を並べ替えます。

IEqualityComparer<T> をコンストラクターに渡す場合、SortedList<TKey, TValue> メソッドを使用して、構成可能な方法でキーによって辞書を並べ替えることができます。 内部的には、リストを効果的に使用して実装されているため、ハッシュ コードで検索する代わりに、バイナリ検索を実行します。

大きなリストを作成できますが、複雑さを回避できるため、パフォーマンスが最適化されているという意味ではありません。 これは、System.Collections.Generic 名前空間に属し、関連する IComparer<T> 実装に基づいています。

コード例:

using System;
using System.Collections.Generic;

public class sortedListExp {
  public static void Main(string[] args) {
    var metal = new SortedList<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    foreach (var console in metal) {
      Console.WriteLine(console);
    }
  }
}

出力:

[Aluminum, 4]
[Platinum, 7]
[Titanium, 3]

C#SortedDictionary<TKey, TValue> クラスを使用して辞書をキーで並べ替える

これは、キーと値のペアがキーで並べ替えられた辞書を表します。これは、対数時間検索操作を使用する二分探索ツリーとして実装されているためです。 ディクショナリの新しいインスタンス (指定されたディクショナリと同じマッピングを含む) を初期化し、そのキーに従って並べ替えます。

O(log n) 検索を行う二分探索木であるジェネリック クラスに属します。ここで、n は辞書内の要素の数を表します。 SortedList<TKey, TValue> に似ていますが、並べ替えられていないデータの挿入および削除操作が高速です。

ディクショナリがハッシュ テーブルとして実装されている間、Red-Black ツリーとして実装されているため、SortedDictionary を使用すると、パフォーマンスに悪影響を与える可能性があります。 ただし、パフォーマンスに大きな違いがない場合は、SortedDictionary を使用すると混乱が少なくなる可能性があります。

コード例:

using System;
using System.Collections.Generic;

public class sortedDictionaryExp {
  public static void Main(string[] args) {
    var metal = new SortedDictionary<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    foreach (var console in metal) {
      Console.WriteLine(console);
    }
  }
}

出力:

[Aluminum, 4]
[Platinum, 7]
[Titanium, 3]

このチュートリアルには、ディクショナリをキーでソートする方法について説明するすべてが含まれており、このトピックに関する混乱が解消される可能性があります。 さらに、究極のパフォーマンスを維持しながらこのタスクを実行するために、いくつかの新しいメソッドまたはデータ構造が注目された可能性があります。

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

関連記事 - Csharp Dictionary