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

【C#】GetEnumerator()でHashSetを反復処理する列挙子(Enumerator)を取得する方法

C#でHashSetの各要素を順番に取り出す(反復処理する)ための列挙子(Enumerator)を取得するには、GetEnumerator()メソッドを使用します。この記事では、実際のコード例と実行結果をもとに、その基本的な使い方をわかりやすく解説します。

HashSet.GetEnumerator()メソッドの基本

GetEnumerator()は、HashSet<T>の要素を走査できるHashSet<T>.Enumerator構造体を返します。取得した列挙子に対して、次の2つのメンバーを組み合わせることで、要素を1つずつ処理できます。

  • MoveNext():次の要素へ進みます。次の要素が存在すればtrue、存在しなければfalseを返します。
  • Current:現在位置にある要素を取得します。

サンプルコード①:GetEnumerator()でHashSetを反復処理する

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main(String[] args) {
      HashSet<string> set1 = new HashSet<string>();
      set1.Add("A");
      set1.Add("B");
      set1.Add("C");
      set1.Add("D");
      set1.Add("E");
      set1.Add("F");
      set1.Add("G");
      set1.Add("H");

      Console.WriteLine("HashSet1の要素一覧...");
      foreach (string res in set1) {
         Console.WriteLine(res);
      }

      HashSet<string> set2 = new HashSet<string>();
      set2.Add("John");
      set2.Add("Jacob");
      set2.Add("Ryan");
      set2.Add("Tom");
      set2.Add("Andy");
      set2.Add("Tim");
      set2.Add("Steve");
      set2.Add("Mark");

      Console.WriteLine("HashSet2の要素一覧...(列挙子を使ってHashSetを反復処理)");
      HashSet<string>.Enumerator demoEnum = set2.GetEnumerator();
      while (demoEnum.MoveNext()) {
         string res = demoEnum.Current;
         Console.WriteLine(res);
      }

      Console.WriteLine("HashSet1とHashSet2は等しいか? = " + set1.Equals(set2));
      Console.WriteLine("HashSet2の要素数 = " + set2.Count);

      set2.Clear();
      Console.WriteLine("HashSet2の要素数(更新後) = " + set2.Count);
   }
}

実行結果

HashSet1の要素一覧...
A
B
C
D
E
F
G
H
HashSet2の要素一覧...(列挙子を使ってHashSetを反復処理)
John
Jacob
Ryan
Tom
Andy
Tim
Steve
Mark
HashSet1とHashSet2は等しいか? = False
HashSet2の要素数 = 8
HashSet2の要素数(更新後) = 0

コードのポイント

  • set2.GetEnumerator()を呼び出すことで、HashSet2専用の列挙子を取得しています。
  • while (demoEnum.MoveNext())のループにより、要素がなくなるまで繰り返し処理を行います。
  • demoEnum.Currentで現在の要素を取り出し、コンソールに出力しています。
  • 両者の内容が異なるためEquals()の結果はFalseとなり、Clear()を実行すると要素数が0に更新されることが確認できます。

サンプルコード②:重複要素の除外とIsSupersetOf()との組み合わせ

次の例では、HashSetが重複した値を自動的に除外する性質と、列挙子による反復処理、さらにIsSupersetOf()メソッドによるスーパーセット判定を組み合わせています。

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main() {
      HashSet<string> set1 = new HashSet<string>();
      set1.Add("AB");
      set1.Add("CD");
      set1.Add("EF");
      set1.Add("AB"); // 重複しているため無視される
      set1.Add("IJ");
      set1.Add("KL");
      set1.Add("EF"); // 重複しているため無視される
      set1.Add("OP");

      Console.WriteLine("HashSet1の要素一覧");
      foreach(string val in set1) {
         Console.WriteLine(val);
      }

      HashSet<string> set2 = new HashSet<string>();
      set2.Add("EF");
      set2.Add("KL");

      Console.WriteLine("HashSet2の要素一覧...(列挙子を使ってHashSetを反復処理)");
      HashSet<string>.Enumerator demoEnum = set2.GetEnumerator();
      while (demoEnum.MoveNext()) {
         string res = demoEnum.Current;
         Console.WriteLine(res);
      }

      Console.WriteLine("set1はset2のスーパーセットか? " + set1.IsSupersetOf(set2));
   }
}

実行結果

HashSet1の要素一覧
AB
CD
EF
IJ
KL
OP
HashSet2の要素一覧...(列挙子を使ってHashSetを反復処理)
EF
KL
set1はset2のスーパーセットか? True

コードのポイント

  • HashSetは重複する値("AB"、"EF")を追加時に自動的に排除するため、8回Add()を呼び出しても最終的な要素数は6個になります。
  • set1にはset2のすべての要素("EF"、"KL")が含まれているため、IsSupersetOf()はTrueを返します。

まとめ

HashSetの列挙子を取得するにはGetEnumerator()メソッドを使い、MoveNext()Currentを組み合わせることで全要素を反復処理できます。foreach文でも同様の反復が可能ですが、列挙子を明示的に操作することで、よりきめ細かな制御が必要な場面にも柔軟に対応できます。HashSetの重複排除や集合演算と組み合わせれば、効率的なデータ処理が実現できます。

  1. C#でDictionaryを反復処理する列挙子を取得する方法(GetEnumeratorの使い方)

    C#のDictionary<TKey, TValue>クラスでは、GetEnumerator()メソッドを呼び出すことで、ディクショナリ内のキーと値のペアを順番に走査する列挙子(Enumerator)を取得できます。戻り値はIDictionaryEnumerator型として扱うことができ、MoveNext()メソッドで次の要素へ移動しながら、KeyプロパティとValueプロパティでそれぞれキーと値を読み取ります。 例1:int型のキーを持つDictionaryの場合 まずは、キーがint型・値がstring型のディクショナリを作成し、列挙子を使って全要素を表示する基本例を見てみま

  2. C#でStringCollectionを反復処理する列挙子(Enumerator)を取得する方法

    StringCollectionを反復処理するための列挙子(Enumerator)を取得するには、GetEnumerator()メソッドを使用します。このメソッドはStringEnumerator型のオブジェクトを返し、MoveNext()とCurrentを組み合わせることで、コレクション内の各要素に順番にアクセスできます。基本的な使い方まずは、配列の要素をStringCollectionに追加し、列挙子を使って反復処理する例を見てみましょう。using System; using System.Collections.Specialized; public class Demo { &nbs