C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のSortedListとSortedDictionaryの違いとは?特徴と使い分けを徹底解説


C#には、キーと値のペアを自動的に並べ替えて管理できるコレクションとして、SortedListSortedDictionaryの2種類が用意されています。どちらも「キーに基づいてソート済みの状態でデータを保持する」という共通の目的を持っていますが、内部構造やメモリの使い方、アクセス方法、パフォーマンス特性などに明確な違いがあります。

本記事では、両者の主な相違点を比較表とサンプルコードとともにわかりやすく解説します。

SortedListとSortedDictionaryの違い一覧

No.比較項目SortedListSortedDictionary
1メモリ使用量要素を連続した領域に格納するため、1要素あたりのオーバーヘッドが小さく、消費メモリは少なめです。各要素を個別のノードオブジェクトとして保持するため、オーバーヘッドが大きく、消費メモリは多めになります。
2内部実装内部的にはソート済みの配列(キー配列と値配列)として実装され、要素はメモリ上の連続したブロックに格納されます。赤黒木(平衡二分探索木)として実装され、各要素は独立したオブジェクトとしてヒープ上に分散して配置されます。
3メモリ断片化連続したブロックで管理されるため、要素単位の細かい断片化は発生しにくい構造です。多数の小さなノードがヒープ全体に散在するため、長期間の運用では断片化が起きやすくなります。
4アクセス方法キーとインデックスの両方で要素にアクセスできます。「n番目の要素」を直接取得できるのが大きな特徴です。キーによるアクセスのみをサポートします。インデックスによるアクセスはできません。
5挿入・削除の性能挿入・削除時に後続要素のシフトが必要なため、計算量は O(n) となります。木構造の再バランスのみで済むため、O(log n) で高速に挿入・削除できます。
6検索性能二分探索により O(log n) でキーを検索できます。平衡二分探索木により O(log n) でキーを検索できます。

SortedListが向いているケース

  • メモリ使用量をできるだけ抑えたい場合
  • インデックスを使って順番に要素へアクセスしたい場合
  • データの読み取りが多く、挿入・削除が少ない場合

SortedDictionaryが向いているケース

  • 要素の挿入・削除を頻繁に行う場合
  • キーによるアクセスだけで十分な場合
  • 大規模データでも安定した O(log n) の操作性能が必要な場合

基本的な使い方のサンプルコード

// SortedList の例
var sortedList = new SortedList<string, int>();
sortedList.Add("banana", 2);
sortedList.Add("apple", 1);
Console.WriteLine(sortedList["apple"]);   // キーでアクセス → 1
Console.WriteLine(sortedList.GetKey(0));  // インデックスでアクセス → apple

// SortedDictionary の例
var sortedDict = new SortedDictionary<string, int>();
sortedDict.Add("banana", 2);
sortedDict.Add("apple", 1);
Console.WriteLine(sortedDict["apple"]);   // キーでアクセス → 1
// sortedDict[0] のようなインデックスアクセスは不可

まとめ

SortedListとSortedDictionaryは、どちらもキー順にデータを自動的に保持できるコレクションですが、SortedListは省メモリでインデックスアクセスが可能である一方、SortedDictionaryは挿入・削除が高速という特徴があります。読み取り中心の処理ならSortedList、更新処理が多いシナリオならSortedDictionaryを選ぶことで、アプリケーションの性能を最大限に引き出すことができます。


  1. MEAN.jsとMEAN.ioの違いは?本質的な共通点と選び方をわかりやすく解説

    MEANスタックとは?「MEAN」とは、Webアプリケーション開発で使われる次の4つの技術の頭文字を取った略称です。MongoDB:ドキュメント指向のNoSQLデータベースExpress:Node.js向けの軽量WebアプリケーションフレームワークAngular:Googleが中心となって開発するフロントエンドフレームワークNode.js:サーバーサイドでJavaScriptを実行できるランタイム環境これらを組み合わせることで、フロントエンドからバックエンド、データベースまでをすべてJavaScriptで統一して開発できるのが、MEANスタック最大の魅力です。MEAN.jsとMEAN.ioは本

  2. スタックとヒープの違いを徹底解説!メモリ管理の基礎知識

    プログラムの実行において、メモリ管理は非常に重要な概念です。本記事では、メモリ領域を代表する「スタック」と「ヒープ」の違いについて、それぞれの特徴やメリット・デメリットをわかりやすく解説します。 スタック(Stack)とは スタックは、後入れ先出し(LIFO:Last In First Out)の方式でデータを管理する線形データ構造です。関数呼び出し時のローカル変数など、寿命が明確なデータの格納に適しています。主な特徴は以下の通りです。 線形データ構造であり、メモリは連続したブロックとして割り当てられる。 メモリの割り当てと解放は、コンパイラの指示によって自動的に行われる。 構築・維持にかか