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

C#でListDictionaryが読み取り専用かどうかを確認する方法

C#のListDictionaryが読み取り専用(Read-Only)かどうかを確認するには、IsReadOnlyプロパティを使用します。この記事では、サンプルコードと実行結果をもとに、具体的な確認方法をわかりやすく解説します。

ListDictionaryとは

ListDictionaryは、System.Collections.Specialized名前空間に属するコレクションクラスで、キーと値のペアを単一のリンクリストとして管理します。内部的な構造の特性上、要素数が少ないコレクション(目安として10項目程度まで)において高いパフォーマンスを発揮するため、小規模なデータの格納に適しています。

ディクショナリの状態を確認できる主なプロパティは以下のとおりです。

  • IsReadOnly:ディクショナリが読み取り専用かどうかを示す値を取得します
  • IsFixedSize:ディクショナリが固定サイズかどうかを示す値を取得します
  • IsSynchronized:ディクショナリへのアクセスが同期されている(スレッドセーフ)かどうかを示す値を取得します

例1:IsReadOnlyプロパティで読み取り専用かどうかを確認する

まず、2つのListDictionaryを作成し、それぞれの状態を確認する基本的な例を見てみましょう。

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

public class Demo {
   public static void Main() {
      ListDictionary dict1 = new ListDictionary();
      dict1.Add("A", "書籍");
      dict1.Add("B", "家電製品");
      dict1.Add("C", "スマートウォッチ");
      dict1.Add("D", "ペット用品");
      dict1.Add("E", "衣類");
      dict1.Add("F", "履物");

      Console.WriteLine("ListDictionary1 の要素...");
      foreach (DictionaryEntry d in dict1) {
         Console.WriteLine(d.Key + " " + d.Value);
      }

      Console.WriteLine("ListDictionary1 は固定サイズか? = " + dict1.IsFixedSize);
      Console.WriteLine("ListDictionary1 は読み取り専用か? = " + dict1.IsReadOnly);
      Console.WriteLine("ListDictionary1 は同期されているか? = " + dict1.IsSynchronized);
      Console.WriteLine("ListDictionary1 にキー「M」は存在するか? = " + dict1.Contains("M"));

      ListDictionary dict2 = new ListDictionary();
      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("\nListDictionary2 のキーと値のペア...");
      IDictionaryEnumerator demoEnum = dict2.GetEnumerator();
      while (demoEnum.MoveNext()) {
         Console.WriteLine("Key = " + demoEnum.Key + ", Value = " + demoEnum.Value);
      }

      Console.WriteLine("ListDictionary2 は固定サイズか? = " + dict2.IsFixedSize);
      Console.WriteLine("ListDictionary2 は読み取り専用か? = " + dict2.IsReadOnly);
      Console.WriteLine("ListDictionary2 は同期されているか? = " + dict2.IsSynchronized);
      Console.WriteLine("ListDictionary2 にキー「5」は存在するか? = " + dict2.Contains("5"));
   }
}

実行結果

ListDictionary1 の要素...
A 書籍
B 家電製品
C スマートウォッチ
D ペット用品
E 衣類
F 履物
ListDictionary1 は固定サイズか? = False
ListDictionary1 は読み取り専用か? = False
ListDictionary1 は同期されているか? = False
ListDictionary1 にキー「M」は存在するか? = False

ListDictionary2 のキーと値のペア...
Key = 1, Value = One
Key = 2, Value = Two
Key = 3, Value = Three
Key = 4, Value = Four
Key = 5, Value = Five
Key = 6, Value = Six
ListDictionary2 は固定サイズか? = False
ListDictionary2 は読み取り専用か? = False
ListDictionary2 は同期されているか? = False
ListDictionary2 にキー「5」は存在するか? = True

例2:要素数の多いListDictionaryでの確認例

続いて、10個の要素を持つListDictionaryに対して、同じプロパティの確認に加えて、Containsメソッドによるキーの存在チェックも行う例を紹介します。

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

public class Demo {
   public static void Main() {
      ListDictionary dict = new ListDictionary();
      dict.Add("1", "SUV");
      dict.Add("2", "セダン");
      dict.Add("3", "ユーティリティビークル");
      dict.Add("4", "コンパクトカー");
      dict.Add("5", "SUV");
      dict.Add("6", "セダン");
      dict.Add("7", "ユーティリティビークル");
      dict.Add("8", "コンパクトカー");
      dict.Add("9", "クロスオーバー");
      dict.Add("10", "電気自動車");

      Console.WriteLine("ListDictionary の要素...");
      foreach (DictionaryEntry d in dict) {
         Console.WriteLine(d.Key + " " + d.Value);
      }

      Console.WriteLine("\nListDictionary は固定サイズか? = " + dict.IsFixedSize);
      Console.WriteLine("ListDictionary は読み取り専用か? = " + dict.IsReadOnly);
      Console.WriteLine("ListDictionary は同期されているか? = " + dict.IsSynchronized);
      Console.WriteLine("ListDictionary にキー「K」は存在するか? = " + dict.Contains("K"));
      Console.WriteLine("ListDictionary にキー「9」は存在するか? = " + dict.Contains("9"));
   }
}

実行結果

ListDictionary の要素...
1 SUV
2 セダン
3 ユーティリティビークル
4 コンパクトカー
5 SUV
6 セダン
7 ユーティリティビークル
8 コンパクトカー
9 クロスオーバー
10 電気自動車

ListDictionary は固定サイズか? = False
ListDictionary は読み取り専用か? = False
ListDictionary は同期されているか? = False
ListDictionary にキー「K」は存在するか? = False
ListDictionary にキー「9」は存在するか? = True

まとめ

実行結果から、以下のポイントが確認できます。

  • newで生成した通常のListDictionaryは読み取り専用ではないため、IsReadOnlyプロパティはFalseを返します
  • 固定サイズでも同期(スレッドセーフ)設定もされていないため、IsFixedSize・IsSynchronizedはいずれもFalseを返します
  • Containsメソッドを使えば、指定したキーがディクショナリ内に存在するかどうかを簡単に判定できます

このように、IsReadOnlyプロパティを参照するだけで、ListDictionaryが読み取り専用かどうかを手軽に確認できます。小規模なキー・バリューコレクションを扱う際の状態チェックに、ぜひ活用してみてください。

  1. C#で読み取り専用プロパティ(readonly)を追加する方法をわかりやすく解説

    C#では、readonlyキーワードを使ってフィールドを読み取り専用にすることができます。readonlyが付いたフィールドは、オブジェクトの構築時に一度だけ値を設定でき、その後は変更することができません。変更しようとするとコンパイルエラーが発生します。ここでは、C#で読み取り専用のフィールドやプロパティを扱う方法について、具体例を交えながら詳しく解説します。readonlyフィールドの基本的な使い方まずは、readonlyフィールドを持つクラスの例を見てみましょう。class Employee { readonly int salary; Employee(int sala

  2. C#でリストが空かどうかを確認する方法【Anyメソッドの使い方】

    C#でリストが空かどうかを確認するには?C#でList<T>が空かどうかを確認するには、LINQのAnyメソッドを使用するのが一般的です。Anyメソッドは、シーケンスに要素が1つでも含まれていればtrueを返し、空の場合はfalseを返します。この結果を否定演算子!で反転させることで、リストが空かどうかを簡単に判定できます。リストの作成まず、確認対象となるリストを作成しましょう。var subjects = new List<string>(); subjects.Add("Maths"); subjects.Add("Java"