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

C#のHybridDictionaryクラスとは?主なプロパティとメソッドを実例付きで解説

HybridDictionaryクラスは、IDictionaryインターフェースを実装したクラスで、コレクションのサイズが小さいうちはListDictionaryを使用し、コレクションが大きくなると自動的にHashtableへ切り替えるという特徴を持っています。これにより、要素数が少ない場合の高速な処理と、要素数が多い場合の効率的な検索性能の両方を実現できます。

HybridDictionaryクラスの主なプロパティ

HybridDictionaryクラスには、以下のようなプロパティが用意されています。

番号プロパティと説明
1Count
HybridDictionaryに格納されているキーと値のペアの数を取得します。
2IsFixedSize
HybridDictionaryが固定サイズかどうかを示す値を取得します。
3IsReadOnly
HybridDictionaryが読み取り専用かどうかを示す値を取得します。
4IsSynchronized
HybridDictionaryが同期されている(スレッドセーフである)かどうかを示す値を取得します。
5Item[Object]
指定されたキーに関連付けられた値を取得または設定します。
6Keys
HybridDictionary内のキーを格納するICollectionを取得します。
7SyncRoot
HybridDictionaryへのアクセスを同期するために使用できるオブジェクトを取得します。
8Values
HybridDictionary内の値を格納するICollectionを取得します。

HybridDictionaryクラスの主なメソッド

次に、HybridDictionaryクラスでよく使われるメソッドを紹介します。

番号メソッドと説明
1Add(Object, Object)
指定されたキーと値を持つエントリをHybridDictionaryに追加します。
2Clear()
HybridDictionaryからすべてのエントリを削除します。
3Contains(Object)
HybridDictionaryに特定のキーが含まれているかどうかを判定します。
4CopyTo(Array, Int32)
HybridDictionaryのエントリを、指定されたインデックス位置にある1次元のArrayインスタンスにコピーします。
5Equals(Object)
指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判定します。(Objectクラスから継承)
6GetEnumerator()
HybridDictionaryを反復処理するIDictionaryEnumeratorを返します。
7GetHashCode()
既定のハッシュ関数として機能します。(Objectクラスから継承)
8GetType()
現在のインスタンスのTypeを取得します。(Objectクラスから継承)

例1:キーと値のペアの数をカウントする

HybridDictionary内のキーと値のペアの数を取得するサンプルコードは以下の通りです。

using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
    public static void Main() {
        HybridDictionary dict1 = new HybridDictionary();
        dict1.Add("A", "SUV");
        dict1.Add("B", "MUV");
        dict1.Add("C", "AUV");
        Console.WriteLine("HybridDictionary1 の要素...");
        foreach(DictionaryEntry d in dict1) {
            Console.WriteLine(d.Key + " " + d.Value);
        }
        Console.WriteLine("Dictionary1 のキー/値ペアの数 = "+dict1.Count);
        HybridDictionary dict2 = new HybridDictionary();
        dict2.Add("1", "One");
        dict2.Add("2", "Two");
        dict2.Add("3", "Three");
        dict2.Add("4", "Four");
        dict2.Add("5", "Five");
        dict2.Add("6", "Six");
        Console.WriteLine("\nHybridDictionary2 の要素...");
        foreach(DictionaryEntry d in dict2) {
            Console.WriteLine(d.Key + " " + d.Value);
        }
        Console.WriteLine("Dictionary2 のキー/値ペアの数 = "+dict1.Count);
        dict2.Clear();
        Console.WriteLine("Dictionary2 のキー/値ペアの数(更新後)= "+dict2.Count);
    }
}

出力結果

上記のコードを実行すると、以下の出力が得られます。

HybridDictionary1 の要素...
A SUV
B MUV
C AUV
Dictionary1 のキー/値ペアの数 = 3
HybridDictionary2 の要素...
1 One
2 Two
3 Three
4 Four
5 Five
6 Six
Dictionary2 のキー/値ペアの数 = 3
Dictionary2 のキー/値ペアの数(更新後)= 0

この例では、Countプロパティを使って各ディクショナリの要素数を確認し、Clear()メソッドですべての要素を削除した後、要素数が0になっていることを確認しています。

例2:同期状態や読み取り専用かどうかを確認する

HybridDictionaryが同期されているか(スレッドセーフか)などを確認するサンプルコードは以下の通りです。

using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
    public static void Main() {
        HybridDictionary dict1 = new HybridDictionary();
        dict1.Add("A", "Books");
        dict1.Add("B", "Electronics");
        dict1.Add("C", "Smart Wearables");
        dict1.Add("D", "Pet Supplies");
        dict1.Add("E", "Clothing");
        dict1.Add("F", "Footwear");
        Console.WriteLine("HybridDictionary1 の要素...");
        foreach(DictionaryEntry d in dict1) {
            Console.WriteLine(d.Key + " " + d.Value);
        }
        Console.WriteLine("HybridDictionary1 は固定サイズか? = "+dict1.IsFixedSize);
        Console.WriteLine("HybridDictionary1 は読み取り専用か? = "+dict1.IsReadOnly);
        Console.WriteLine("HybridDictionary1 は同期されているか = "+dict1.IsSynchronized);
        HybridDictionary dict2 = new HybridDictionary();
        dict2.Add("1", "One");
        dict2.Add("2", "Two");
        dict2.Add("3", "Three");
        dict2.Add("4", "Four");
        dict2.Add("5", "Five");
        dict2.Add("6", "Six");
        Console.WriteLine("\nHybridDictionary2 の要素...");
        foreach(DictionaryEntry d in dict2) {
            Console.WriteLine(d.Key + " " + d.Value);
        }
        Console.WriteLine("HybridDictionary1 は HybridDictionary2 と等しいか? = "+(dict1.Equals(dict2)));
        Console.WriteLine("HybridDictionary2 は固定サイズか? = "+dict2.IsFixedSize);
        Console.WriteLine("HybridDictionary2 は読み取り専用か? = "+dict2.IsReadOnly);
        Console.WriteLine("HybridDictionary2 は同期されているか = "+dict2.IsSynchronized);
    }
}

出力結果

上記のコードを実行すると、以下の出力が得られます。

HybridDictionary1 の要素...
A Books
B Electronics
C Smart Wearables
D Pet Supplies
E Clothing
F Footwear
HybridDictionary1 は固定サイズか? = False
HybridDictionary1 は読み取り専用か? = False
HybridDictionary1 は同期されているか = False
HybridDictionary2 の要素...
1 One
2 Two
3 Three
4 Four
5 Five
6 Six
HybridDictionary1 は HybridDictionary2 と等しいか? = False
HybridDictionary2 は固定サイズか? = False
HybridDictionary2 は読み取り専用か? = False
HybridDictionary2 は同期されているか = False

このように、IsFixedSizeIsReadOnlyIsSynchronizedなどのプロパティを使うことで、HybridDictionaryの状態を簡単に確認できます。また、Equals()メソッドを使用すれば、2つのHybridDictionaryが等しいかどうかを比較することも可能です。

まとめ

HybridDictionaryは、要素数に応じて内部実装を自動的に切り替える柔軟なコレクションクラスです。小規模データではListDictionaryの高速性を、大規模データではHashtableの検索効率を活かせるため、事前にデータ量が予測できない場合に特に有用です。名前空間System.Collections.Specializedに属している点にも注意してください。

  1. C#のConsoleクラスとは?主要プロパティの使い方を実例付きで解説

    C#のConsoleクラスは、コンソールアプリケーションにおける標準入力・標準出力・標準エラー出力の各ストリームを表すクラスです。テキストの表示や入力の読み取りだけでなく、文字色や背景色の変更、カーソル位置やサイズの制御など、コンソール操作に関するさまざまな機能が提供されています。ここでは、Consoleクラスの代表的なプロパティの使い方を、サンプルコードと実行結果とあわせて解説します。Console.CursorLeftプロパティコンソール上のカーソル位置(左端から数えた列位置)を変更するには、Console.CursorLeftプロパティを使用します。サンプルコードusing System

  2. C#のBackgroundWorkerクラスとは?主なプロパティと使い方を解説

    BackgroundWorkerクラスとはその名の通り、BackgroundWorkerクラスを使用すると、バックグラウンドで継続的に実行されるスレッドを設定し、必要に応じてメインスレッドと通信することができます。BackgroundWorkerを活用することで、Windows Formsアプリケーションにおけるマルチスレッド処理の実装が格段に容易になります。時間のかかる重い処理は別のスレッド上で実行することで、UI(ユーザーインターフェース)がフリーズするのを防ぐことができます。さらに、処理の進行状況や完了をメインスレッドへ通知し、画面を更新することも可能です。BackgroundWorke