月ノ書

C#のSet(HashSet)をわかりやすく解説|Listとの違いと重複しないコレクション

この記事でわかること
  • C#における Set(HashSet)の考え方がわかる
  • List と HashSet の違いを理解できる
  • 重複を許さないコレクションの使いどころがわかる
  • 基本的な操作と繰り返し処理の組み合わせが身につく

Set(HashSet)とは何か

C#における Set は、主に HashSet を指します

HashSet<int> numbers = new HashSet<int>();

HashSet の最大の特徴は

という点です

HashSetとListの違い

ここで List との違いを整理します

項目ListHashSet
重複許可される許可されない
順番保持される保証されない
検索やや遅い速い
主な用途一覧管理重複排除

「順番よりも一意性」が重要なときに HashSet は力を発揮します

要素を追加する(Add)

HashSet に要素を追加する方法は List とほぼ同じです

HashSet<int> numbers = new HashSet<int>();

numbers.Add(10);
numbers.Add(20);
numbers.Add(10);

この場合、10 は1回しか登録されません
重複しないことを、HashSet 自身が保証してくれます

要素が含まれているか確認する(Contains)

HashSet が特に得意なのが検索です

bool exists = numbers.Contains(20);

大量のデータの中から
「この値があるかどうか」
を確認したいときに、とても高速に判定できます

要素を削除する(Remove)

不要になった要素は削除できます

numbers.Remove(10);

List と違い、インデックスという概念がないため
「何番目を消す」という指定はできません

繰り返し処理とHashSet

HashSet も foreach で簡単に回せます

foreach (int number in numbers)
{
    Console.WriteLine(number);
}

順番は保証されないため
「並び順が重要な処理」には向いていません

HashSetが向いている場面

HashSet は次のような場面で活躍します

HashSet<string> users = new HashSet<string>();

users.Add("Alice");
users.Add("Bob");
users.Add("Alice"); // 無視される

このように、チェック処理を書かなくても安全に扱えます

集合演算ができる

HashSet は、集合としての操作も可能です

HashSet<int> a = new HashSet<int> { 1, 2, 3 };
HashSet<int> b = new HashSet<int> { 3, 4, 5 };

a.UnionWith(b);      // 和集合
a.IntersectWith(b); // 積集合

数学的な集合操作が必要な場合にも、とても便利です

HashSetを使うときの注意点

「一覧として見せたい」なら List
「重複させたくない」なら HashSet

この意識があるだけで、選択を間違えにくくなります

まとめ

学習進捗