C#のSet(HashSet)をわかりやすく解説|Listとの違いと重複しないコレクション
この記事でわかること
- C#における Set(HashSet)の考え方がわかる
- List と HashSet の違いを理解できる
- 重複を許さないコレクションの使いどころがわかる
- 基本的な操作と繰り返し処理の組み合わせが身につく
Set(HashSet)とは何か
C#における Set は、主に HashSet を指します
HashSet<int> numbers = new HashSet<int>();HashSet の最大の特徴は
- 同じ値を複数入れられない
- 要素の順番が保証されない
という点です
HashSetとListの違い
ここで List との違いを整理します
| 項目 | List | HashSet |
|---|---|---|
| 重複 | 許可される | 許可されない |
| 順番 | 保持される | 保証されない |
| 検索 | やや遅い | 速い |
| 主な用途 | 一覧管理 | 重複排除 |
「順番よりも一意性」が重要なときに 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
この意識があるだけで、選択を間違えにくくなります
まとめ
- HashSet は重複しないコレクション
- 要素の順番は保証されない
- Contains による高速検索が強み
- 重複チェックを書かずに安全に扱える
- 一意性が重要な場面で使う