C# ハッシュテーブルと例

⚡ スマートサマリー

C# のハッシュテーブルは、System.Collections 名前空間のコレクションであり、データをキーと値のペアとして格納します。各一意のキーは値に対応付けられ、キーによって格納された値を高速に検索できます。

  • 📚 キーと値のペア: ハッシュテーブルは、スタックや配列リストのように単一の値を保持するのではなく、要素ごとにキーとその値の2つの値を格納します。
  • 要素の追加: Addメソッドはキーと値を一緒に挿入します。ハッシュテーブル内のすべてのキーは一意である必要があります。
  • 👀 ContainsKey と ContainsValue: これらのメソッドはtrueまたはfalseを返すため、キーまたは値が既に存在するかどうかをテストできます。
  • 🔁 読み値: ICollection の Keys プロパティ、または DictionaryEntry ループを使用すると、格納されているすべての値を順番に読み取ることができます。
  • 🛠️ 方法と特性: 削除、クリア、カウント、キー、値を使用して、ハッシュテーブルの内容を管理および検査します。
  • 🤖 AI支援: GitHub Copilotはハッシュテーブルのコードを自動生成する一方、最新のC#とML.NETは型安全なキーと値のペアのデータには汎用的なDictionaryを推奨している。

C# ハッシュテーブル

C# のハッシュテーブルとは何ですか?

ハッシュ テーブルは、キーと値の項目を格納するために使用される特別なコレクションです。 したがって、スタック、配列リスト、キューのように 2 つの値だけを保存するのではなく、ハッシュ テーブルには 2 つの値が保存されます。 これら XNUMX つの値は、ハッシュ テーブルの要素を形成します。

以下は、ハッシュ テーブルの値がどのように見えるかを示す例です。

{ "001" , ".Net" }
{ "002" , ".C#" }
{ "003" , "ASP.Net" }

上記には 3 つのキーと値のペアがあります。 各要素のキーはそれぞれ 001、002、003 です。 各キーと値のペアの値は次のとおりです。それぞれ「」、「C#」、「ASP.Net」です。

Hashtable コレクションで使用できる操作を詳しく見てみましょう。

ハッシュテーブルの宣言

ハッシュテーブルの宣言を以下に示します。 ハッシュテーブルは、ハッシュテーブル データ型を使用して作成されます。 「new」キーワードは、ハッシュテーブルのオブジェクトを作成するために使用されます。 次に、オブジェクトは変数 ht に割り当てられます。

Hashtable ht = new Hashtable()

ハッシュテーブルへの要素の追加

Add メソッドは、要素を キュー。 ステートメントの一般的な構文を以下に示します。

HashTable.add("key","value")

例1:

ハッシュ テーブルの各要素は 2 つの値で構成され、XNUMX つはキー、もう XNUMX つは値であることに注意してください。

では、これがコードレベルで動作する様子を見てみましょう。 以下のコードはすべて、コンソール アプリケーションに書き込まれます。

コードは Program.cs ファイルに書き込まれます。 以下のプログラムでは、上記のメソッドをどのように使用できるかを確認するコードを記述します。

今のところ、この例では、 hashtable を作成し、要素を hashtable に追加し、それに応じて表示する方法だけを見ていきます。

C# のハッシュテーブル

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   ICollection keys = ht.Keys;

   foreach (String k in keys)
   {
    Console.WriteLine(ht[k]);
   }
    Console.ReadKey();
   }
 }
}

Code 説明:-

  1. まず、キーワード「New」を使用して Hashtable データ型を使用してハッシュテーブル変数を宣言します。 定義する変数の名前は「ht」です。
  2. 次に、Add メソッドを使用して要素をハッシュ テーブルに追加します。 ハッシュテーブルに何かを追加するときは、キー要素と値要素の両方を追加する必要があることに注意してください。
  3. ハッシュ テーブルの要素を直接表示する方法はありません。
    • ハッシュ テーブルを表示するには、まずハッシュ テーブルからキーのリスト (001、002、003) を取得する必要があります。
    • これは、ICollection インターフェイスを介して行われます。 これは、ハッシュテーブル コレクションのキーを格納するために使用できる特別なデータ型です。 次に、ハッシュテーブル コレクションのキーを変数 'keys' に割り当てます。
  4. 次に、ステートメント ht[k] を使用して、キー値ごとにハッシュテーブル内の関連する値を取得します。

上記のコードが正しく入力され、プログラムが実行されると、次の出力が表示されます。

出力:

C# のハッシュテーブル

ハッシュ テーブルで使用できるメソッドをさらにいくつか見てみましょう。

キーを含む

このメソッドは、ハッシュテーブルにキーが存在するかどうかを確認するために使用されます。 以下は、このステートメントの一般的な構文です。 このステートメントは、キーが存在する場合は true を返し、それ以外の場合は値 false を返します。

Hashtable.Containskey(key)

値を含む

このメソッドは、ハッシュテーブルに値が存在するかどうかを確認するために使用されます。 以下は、このステートメントの一般的な構文です。 このステートメントは、値が存在する場合は true を返し、存在しない場合は値 false を返します。

Hashtable.ContainsValue(value)

例2:

コードを変更しましょう コンソールアプリケーション 「Containskey」メソッドと「ContainsValue」メソッドの使用方法を紹介します。

C# のハッシュテーブル

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   Console.WriteLine(ht.ContainsKey("001"));
   Console.WriteLine(ht.ContainsValue("C#"));
   Console.ReadKey();
   }
 }
}

Code 説明:-

  1. まず、ContainsKey メソッドを使用して、キーがハッシュテーブルに存在するかどうかを確認します。 キーがハッシュテーブルに存在する場合、このメソッドは true を返します。 キーはハッシュテーブルに存在するため、このメソッドは true を返す必要があります。
  2. 次に、ContainsValue メソッドを使用して、値がハッシュテーブルに存在するかどうかを確認します。 値がハッシュテーブルに存在するため、このメソッドは「true」を返します。

上記のコードが正しく入力され、プログラムが実行されると、次の出力が表示されます。

出力:

C# のハッシュテーブル

出力から、検索対象のキーと値の両方がハッシュ テーブルに存在することが明確にわかります。

C#ハッシュテーブルをループ処理する方法

上記の例ではKeysコレクションを通して値を読み取りましたが、ハッシュテーブルはもっと簡潔な方法で処理できます。DictionaryEntryに対するforeachループを使用すると、すべての要素のキーと値を一度に取得できるため、ハッシュテーブルを読み取る最も一般的な方法となります。

ステップ1) ハッシュテーブルを作成し、そこに3つのキーと値のペアを追加します。

ステップ2) DictionaryEntry変数を使用してハッシュテーブルをループ処理し、各エントリのKeyプロパティとValueプロパティを読み取ります。

using System;
using System.Collections;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("101", "Java");
   ht.Add("102", "Python");
   ht.Add("103", "Kotlin");

   foreach (DictionaryEntry entry in ht)
   {
    Console.WriteLine(entry.Key + " - " + entry.Value);
   }
   Console.ReadKey();
  }
 }
}

Code 説明:-

  1. htという名前のハッシュテーブルが作成され、Addメソッドを使用して3つのキーと値のペアが挿入されます。
  2. foreachループは各要素をDictionaryEntryに割り当て、そのKeyプロパティとValueプロパティはペアの2つの部分を公開します。

プログラムを実行すると、101 – のように、各キーとその値の横にそれぞれが出力されます。 Javaハッシュテーブルは挿入順序を保持しないため、ペアは追加された順序とは異なる順序で出現する可能性があります。キーのみを読み取るにはKeysコレクションをループし、値のみを読み取るにはValuesコレクションをループしてください。

C# ハッシュテーブルのメソッドとプロパティ

Hashtableクラスは、ペアの追加や削除から、メンバーシップの確認、要素数のカウントまで、必要なほぼすべてのタスクを網羅する少数のメソッドとプロパティを提供します。最も便利なメンバーを以下に示します。

Member タイプ 詳細説明
キーと値を追加する 方法 新しいキーと値のペアを挿入します。キーは一意である必要があります。
削除(キー) 方法 指定されたキーに一致する要素を削除します。
クリア() 方法 ハッシュテーブルからすべてのキーと値のペアを削除します。
ContainsKey(key) 方法 指定されたキーが存在する場合にtrueを返します。
ContainsValue(value) 方法 指定された値が存在する場合にtrueを返します。
数量カウント プロパティ 保存されているキーと値のペアの数を取得します。
キーズ プロパティ すべてのキーのコレクションを返します。
価値観 プロパティ すべての値のコレクションを返します。

各キーがハッシュ化されているため、ContainsKeyとインデクサーはほぼ一定時間で要素を特定できます。これがハッシュテーブルが高速検索に非常に役立つ理由です。

C#におけるハッシュテーブルと辞書の違い

ハッシュテーブルと辞書はどちらもキーと値のペアを格納し、どちらもC#のより広いファミリーに属します。 コレクション重要な違いは型安全性であり、その違いによって、新しいコードでどちらを採用すべきかが決まります。

  • 型式安全性: ハッシュテーブルはすべてのキーと値をオブジェクトとして格納しますが、辞書はは汎用的なので、コンパイラは使用する型をチェックします。
  • 名前空間: Hashtable は System.Collections に属し、Dictionary は System.Collections.Generic に属します。
  • Boxing: ハッシュテーブルはintなどの値型を囲い込みますが、汎用的な辞書はそれらを直接格納するため、そのコストを回避できます。
  • パフォーマンス: 辞書は、値を読み取る際にオブジェクトから元のオブジェクトへ型変換する必要がないため、通常は高速です。
  • ねじの安全性: Hashtableは Sync1 つのライターと多数のリーダーのための標準化されたラッパーであり、並行コードは通常 ConcurrentDictionary を選択します。

新規プロジェクトにおいては、汎用的な辞書型が推奨される選択肢であり、非汎用的なハッシュテーブル型は主に古いコードで見られる。

よくあるご質問

Remove メソッドは、指定されたキーを持つ要素を削除し、Count を 1 減らします。キーが存在しない場合は何も起こりません。キーが存在することを確実に確認する必要がある場合は、まず ContainsKey メソッドを呼び出してください。

いいえ。ハッシュテーブル内のすべてのキーは一意でなければなりません。既に存在するキーを指定して Add メソッドを呼び出すと、ArgumentException が発生します。ただし、同じ値を複数の異なるキーに格納することは、エラーなく行えます。

ハッシュテーブルは、1人の書き込み側と多数の読み取り側を安全にサポートします。複数の書き込みスレッドを使用する場合は、ハッシュテーブルでラップしてください。Sync同期化するか、外部ロックなしで同時読み取りと書き込みを処理する System.Collections.Concurrent の ConcurrentDictionary を使用することをお勧めします。

キーによる値の検索は、キーをハッシュ化して対応するバケットを見つけるため、平均的にはほぼ定数時間(O(1))で実行されます。ハッシュ衝突が頻繁に発生すると処理速度が低下する可能性がありますが、キーが適切に分散されている場合はまれです。

値はnullでも構いませんが、キーはnullにすることはできません。Add関数またはインデクサーにnullキーを渡すと、ArgumentNullExceptionがスローされます。また、各キーは一意である必要があり、保存中は変更してはなりません。

ハッシュテーブルは順序を保持しないため、その場でソートすることはできません。キーをリストまたはArrayListにコピーし、そのリストをソートしてから、キーに基づいて値を読み取ります。SortedListはエントリを自動的に順序付けします。

はい。GitHub Copilot は、短いコメントまたはメソッド名からハッシュテーブルの宣言、Add メソッドの呼び出し、DictionaryEntry のループを生成します。新しい C# コードでは Dictionary が推奨されるコレクションであるため、多くの場合、汎用的な Dictionary を提案します。

ML.NET のトレーニングデータは、ハッシュテーブルではなく、型付きコレクションと IDataView パイプラインを介して流れます。ただし、ハッシュベースのキーと値のマップは、機械学習モデルにおける特徴量の検索、語彙のエンコード、およびキャッシュを引き続きサポートします。