【C#】HashSetの使い方|重複を許さないコレクション

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 で削除
  • UnionWithIntersectWith で集合演算が可能

順序や重複が重要な場合は List を、重複を排除して集合的に扱いたい場合は HashSet を使い分けましょう。