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

C#のStringDictionaryクラスとは?主なプロパティ・メソッドと使用例をわかりやすく解説

StringDictionaryクラスとは

C#のStringDictionaryクラスは、キーと値がどちらも文字列(string型)として厳密に型指定されたハッシュテーブルを実装するコレクションクラスです。通常のHashtableではキーも値もobject型として扱われるためキャストが必要ですが、StringDictionaryを使えば文字列に特化した型安全な操作が可能になります。このクラスはSystem.Collections.Specialized名前空間に属しています。

なお、StringDictionaryはキーを自動的に小文字に変換して管理するという特徴もあります。大文字で追加したキーも、内部的には小文字として格納される点に注意しましょう。

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

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

番号プロパティと説明
1Count
StringDictionaryに格納されているキーと値のペアの数を取得します。
2IsSynchronized
StringDictionaryへのアクセスが同期されている(スレッドセーフ)かどうかを示す値を取得します。
3this[String]
指定したキーに関連付けられた値を取得または設定します。
4Keys
StringDictionary内のキーのコレクションを取得します。
5SyncRoot
StringDictionaryへのアクセスを同期するために使用できるオブジェクトを取得します。
6Values
StringDictionary内の値のコレクションを取得します。

StringDictionaryクラスの主なメソッド

続いて、StringDictionaryクラスの代表的なメソッドを紹介します。

番号メソッドと説明
1Add(String, String)
指定したキーと値を持つエントリをStringDictionaryに追加します。
2Clear()
StringDictionaryからすべてのエントリを削除します。
3ContainsKey(String)
指定したキーがStringDictionaryに含まれているかどうかを判断します。
4ContainsValue(String)
指定した値がStringDictionaryに含まれているかどうかを判断します。
5CopyTo(Array, Int32)
文字列ディクショナリの値を、指定したインデックス位置から1次元配列へコピーします。
6Equals(Object)
指定したオブジェクトが現在のオブジェクトと等しいかどうかを判断します(Objectクラスから継承)。

使用例1:2つのStringDictionaryが等しいかどうかを比較する

まず、2つのStringDictionaryオブジェクトが等しいかどうかをEquals()メソッドで確認する例を見てみましょう。

using System;
using System.Collections.Specialized;

public class Demo {
    public static void Main() {
        StringDictionary strDict1 = new StringDictionary();
        strDict1.Add("A", "John");
        strDict1.Add("B", "Andy");
        strDict1.Add("C", "Tim");
        strDict1.Add("D", "Ryan");
        strDict1.Add("E", "Kevin");
        strDict1.Add("F", "Katie");
        strDict1.Add("G", "Brad");

        StringDictionary strDict2 = new StringDictionary();
        strDict2.Add("A", "John");
        strDict2.Add("B", "Andy");
        strDict2.Add("C", "Tim");
        strDict2.Add("D", "Ryan");
        strDict2.Add("E", "Kevin");
        strDict2.Add("F", "Katie");
        strDict2.Add("G", "Brad");

        StringDictionary strDict3 = new StringDictionary();
        strDict3 = strDict2;

        Console.WriteLine("Is Dictionary2 equal to Dictionary3? = " + strDict2.Equals(strDict3));
        Console.WriteLine("Is Dictionary1 equal to Dictionary3? = " + strDict1.Equals(strDict3));
    }
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

Is Dictionary2 equal to Dictionary3? = True
Is Dictionary1 equal to Dictionary3? = False

strDict3にはstrDict2への参照が代入されているため、両者は同一インスタンスを指しており、Equals()の結果はTrueになります。一方、strDict1は内容が同じでも別インスタンスなので、比較結果はFalseとなる点に注意してください。

使用例2:StringDictionaryが同期されているかどうかを確認する

次に、foreachループとIEnumeratorを使って要素を列挙し、IsSynchronizedプロパティで同期状態を確認する例を紹介します。

using System;
using System.Collections;
using System.Collections.Specialized;

public class Demo {
    public static void Main() {
        StringDictionary strDict1 = new StringDictionary();
        strDict1.Add("A", "John");
        strDict1.Add("B", "Andy");
        strDict1.Add("C", "Tim");
        strDict1.Add("D", "Ryan");
        strDict1.Add("E", "Kevin");
        strDict1.Add("F", "Katie");
        strDict1.Add("G", "Brad");

        Console.WriteLine("StringDictionary1 elements...");
        foreach(DictionaryEntry de in strDict1) {
            Console.WriteLine(de.Key + " " + de.Value);
        }

        StringDictionary strDict2 = new StringDictionary();
        strDict2.Add("1", "A");
        strDict2.Add("2", "B");
        strDict2.Add("3", "C");
        strDict2.Add("4", "D");
        strDict2.Add("5", "E");

        Console.WriteLine("\nStringDictionary2 key-value pairs...");
        IEnumerator demoEnum = strDict2.GetEnumerator();
        DictionaryEntry d;
        while (demoEnum.MoveNext()) {
            d = (DictionaryEntry)demoEnum.Current;
            Console.WriteLine("Key = " + d.Key + ", Value = " + d.Value);
        }

        Console.WriteLine("Is the StringDictionary2 synchronized? = " + strDict2.IsSynchronized);
    }
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

StringDictionary1 elements...
a John
b Andy
c Tim
d Ryan
e Kevin
f Katie
g Brad
StringDictionary2 key-value pairs...
Key = 1, Value = A
Key = 2, Value = B
Key = 3, Value = C
Key = 4, Value = D
Key = 5, Value = E
Is the StringDictionary2 synchronized? = False

出力結果を見ると、追加時に大文字で指定したキー(A〜G)が小文字(a〜g)として表示されています。これは前述のとおり、StringDictionaryがキーを小文字に正規化して扱うためです。また、既定のStringDictionaryインスタンスは同期されていないため、IsSynchronizedの結果はFalseになります。マルチスレッド環境で安全に利用したい場合は、SyncRootを使って明示的に同期処理を行う必要があります。

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

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

  2. C#のクラスとは?基本構文からサンプルコードまで徹底解説

    C#におけるクラスとは、データ型の「設計図(ブループリント)」に相当するものです。クラスをもとに生成された実体をオブジェクトと呼び、オブジェクトはクラスのインスタンスであるといえます。また、クラスを構成するメソッドや変数は、まとめてクラスのメンバーと呼ばれます。クラスの一般的な定義形式C#でクラスを定義する際の一般的な書式は以下のとおりです。<アクセス修飾子> class クラス名 {     // メンバー変数     <アクセス修飾子> <データ型> 変数1;  &