C# の HashSet<T>
は、要素の重複を許さないコレクションです。リストのように順序は保証されませんが、高速な検索・追加・削除が可能です。集合演算(和・積・差)もサポートしており、数学的な集合操作をコードで簡単に表現できます。本記事では HashSet
の基本的な使い方を解説します。
HashSetの基本構文
HashSet<T>
はジェネリックコレクションで、要素の型を指定して利用します。追加時に同じ要素が存在する場合は無視されます。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
HashSet<string> set = new HashSet<string>();
// 要素の追加
set.Add("Apple");
set.Add("Banana");
set.Add("Orange");
set.Add("Apple"); // 重複は追加されない
foreach (var item in set)
{
Console.WriteLine(item);
}
}
}
要素の存在確認
Contains
メソッドを使うと、指定した要素が含まれているかを高速に判定できます。
if (set.Contains("Banana"))
{
Console.WriteLine("Banana は含まれています");
}
要素の削除
Remove
を使うと、指定した要素を削除できます。
set.Remove("Orange");
集合演算
HashSet
は数学的な集合演算をサポートしており、複数の集合を効率的に処理できます。
HashSet<int> set1 = new HashSet<int> { 1, 2, 3, 4 };
HashSet<int> set2 = new HashSet<int> { 3, 4, 5, 6 };
// 和集合(Union)
set1.UnionWith(set2); // {1,2,3,4,5,6}
// 積集合(Intersect)
set1.IntersectWith(set2); // {3,4}
// 差集合(Except)
set1.ExceptWith(set2); // set1 の要素から set2 を取り除く
// 対称差(SymmetricExcept)
set1.SymmetricExceptWith(set2); // どちらか一方に含まれる要素
HashSetとListの違い
特徴 | List<T> | HashSet<T> |
---|---|---|
重複 | 許可される | 許可されない |
順序 | 保持される | 保証されない |
検索速度 | O(n) | O(1)(ハッシュを利用) |
まとめ
HashSet<T>
は「重複を排除したい」「集合演算を効率的に行いたい」場合に便利なコレクションです。
Add
で要素を追加(重複は無視)Contains
で存在確認Remove
で削除UnionWith
やIntersectWith
で集合演算が可能
順序や重複が重要な場合は List
を、重複を排除して集合的に扱いたい場合は HashSet
を使い分けましょう。