【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の重複排除や集合演算と組み合わせれば、効率的なデータ処理が実現できます。
-
C#でDictionaryを反復処理する列挙子を取得する方法(GetEnumeratorの使い方)
C#のDictionary<TKey, TValue>クラスでは、GetEnumerator()メソッドを呼び出すことで、ディクショナリ内のキーと値のペアを順番に走査する列挙子(Enumerator)を取得できます。戻り値はIDictionaryEnumerator型として扱うことができ、MoveNext()メソッドで次の要素へ移動しながら、KeyプロパティとValueプロパティでそれぞれキーと値を読み取ります。 例1:int型のキーを持つDictionaryの場合 まずは、キーがint型・値がstring型のディクショナリを作成し、列挙子を使って全要素を表示する基本例を見てみま
-
C#でStringCollectionを反復処理する列挙子(Enumerator)を取得する方法
StringCollectionを反復処理するための列挙子(Enumerator)を取得するには、GetEnumerator()メソッドを使用します。このメソッドはStringEnumerator型のオブジェクトを返し、MoveNext()とCurrentを組み合わせることで、コレクション内の各要素に順番にアクセスできます。基本的な使い方まずは、配列の要素をStringCollectionに追加し、列挙子を使って反復処理する例を見てみましょう。using System; using System.Collections.Specialized; public class Demo { &nbs