カテゴリ: VB.NET 更新日: 2026/01/27

VB.NETのHashSet(Of T)入門!重複を許さない高速な集合操作をマスター

VB.NETのハッシュセット(HashSet(Of T))の基本と使いどころ
VB.NETのハッシュセット(HashSet(Of T))の基本と使いどころ

先生と生徒の会話形式で理解しよう

生徒

「VB.NETでデータを管理するとき、同じデータが何度も入らないようにする方法はありますか?」

先生

「それなら『HashSet(ハッシュセット)』を使うのが一番ですよ。自動的に重複を省いてくれる便利な道具です。」

生徒

「配列やリストとは何が違うんですか?」

先生

「配列が『順番通りに並べる棚』なら、HashSetは『一意なアイテムだけを入れる魔法の袋』のようなものです。詳しく解説しますね!」

1. HashSet(Of T)とは?重複を防ぐ魔法のコレクション

1. HashSet(Of T)とは?重複を防ぐ魔法のコレクション
1. HashSet(Of T)とは?重複を防ぐ魔法のコレクション

VB.NETのHashSet(Of T)は、データの集まり(コレクション)を扱うための仕組みの一つです。最大の特徴は、「同じ値を二つ以上入れることができない」という点にあります。例えば、出席名簿を作るときに誤って同じ人を二回登録してしまうミスを防ぎたい場合、このHashSetが非常に役立ちます。

また、HashSetはデータの検索が非常に高速です。何万件というデータの中から「特定のデータが含まれているか?」を確認する作業は、配列やリストよりも圧倒的に速く終わります。これは、内部でハッシュ値という、データごとの「固有の背番号」のようなものを使って管理しているからです。プログラミング未経験の方にとって、HashSetは「ユニーク(唯一)なものの集まりを高速に処理する専門家」だと覚えておくと良いでしょう。

2. HashSetの作り方とデータの追加方法

2. HashSetの作り方とデータの追加方法
2. HashSetの作り方とデータの追加方法

まずは、HashSetをプログラムの中で作成(インスタンス化)する方法を見ていきましょう。VB.NETでは、Ofという言葉を使って、そのHashSetにどのような種類のデータ(データ型)を入れるかを指定します。

例えば、果物の名前(文字列型:String)を管理するHashSetを作る場合は、以下のように記述します。パソコンを触ったことがない方でも、この書き方を覚えれば、自分専用の「重複禁止リスト」を簡単に作ることができます。


' 文字列を入れるHashSetを新しく作る
Dim fruits As New HashSet(Of String)()

' データを追加する
fruits.Add("りんご")
fruits.Add("バナナ")
fruits.Add("りんご") ' すでに「りんご」があるので、これは無視されます

' 登録されている数を表示する
Console.WriteLine("登録されている果物の数: " & fruits.Count)

登録されている果物の数: 2

上記のプログラムでは、「りんご」を二回追加しようとしていますが、HashSetが自動的に判断して重複を無視したため、カウントは「2」になります。これがHashSetの大きな魅力です。

3. データの有無を瞬時に確認する(Contains)

3. データの有無を瞬時に確認する(Contains)
3. データの有無を瞬時に確認する(Contains)

HashSetのもう一つの大きな使いどころは、「特定のデータが入っているかどうかを確認する」ときです。これには Contains(コンテインズ)という命令を使います。この命令は、リストの中にデータがあれば「True(真)」、なければ「False(偽)」を返します。

例えば、会員限定のイベントで、来場した人が会員リストに載っているかを調べたい場合に便利です。何千人も会員がいたとしても、HashSetなら一瞬で「はい、載っています」か「いいえ、載っていません」を判定できます。これを検索効率が良いと表現します。


Dim members As New HashSet(Of Integer)({101, 102, 105, 201})

Dim searchID As Integer = 105

' 指定したIDが含まれているか確認する
If members.Contains(searchID) Then
    Console.WriteLine("ID: " & searchID & " は会員リストに登録されています。")
Else
    Console.WriteLine("ID: " & searchID & " は見つかりませんでした。")
End If

ID: 105 は会員リストに登録されています。

4. 数学のような「集合演算」が得意

4. 数学のような「集合演算」が得意
4. 数学のような「集合演算」が得意

HashSetの本領発揮と言えるのが、二つのリストを比べる集合演算(しゅうごうえんざん)です。これは数学の授業で習う「共通部分」や「和集合」といった考え方をプログラムで実現するものです。

  • 積集合 (IntersectWith): 二つのリストの両方に存在するデータだけを残します。(共通の趣味を持つ人を探すなど)
  • 和集合 (UnionWith): 二つのリストを合体させ、重複を一つにまとめます。(二つのグループの全メンバーリストを作るなど)
  • 差集合 (ExceptWith): 片方のリストから、もう片方のリストに含まれるデータを取り除きます。(未提出者のリストを作るなど)

これらを使うと、複雑なデータの抽出も数行のコードで書けるようになります。パソコンが得意な「正確で素早い計算」を、もっとも実感できる機能の一つです。

5. リストの合体と重複削除の具体例

5. リストの合体と重複削除の具体例
5. リストの合体と重複削除の具体例

実際に、二つのグループのメンバーを一つにまとめるプログラムを書いてみましょう。ただの配列やリストだと、同じ人が混ざってしまう可能性がありますが、HashSetを使えば自動的に整理されたリストが出来上がります。


' グループAのメンバー
Dim groupA As New HashSet(Of String)({"佐藤", "鈴木", "高橋"})

' グループBのメンバー
Dim groupB As New String() {"鈴木", "田中", "伊藤"}

' グループAにグループBのメンバーを合体させる(和集合)
groupA.UnionWith(groupB)

Console.WriteLine("全メンバー一覧:")
For Each name As String In groupA
    Console.WriteLine("- " & name)
Next

全メンバー一覧:
- 佐藤
- 鈴木
- 高橋
- 田中
- 伊藤

このように、両方のグループにいた「鈴木」さんは一人だけになり、全員が漏れなくリストアップされます。手作業だと間違いやすい作業も、HashSetなら安心です。

6. HashSetを使うときの注意点:順番は保証されない

6. HashSetを使うときの注意点:順番は保証されない
6. HashSetを使うときの注意点:順番は保証されない

非常に便利なHashSetですが、一つだけ苦手なことがあります。それは「データの順番を覚えること」です。配列やリストは、追加した順番にデータが並びますが、HashSetは効率よくデータを管理するために、内部で勝手に順番を入れ替えてしまうことがあります。

そのため、「最初に入れたデータを取り出したい」とか「五十音順に並べておきたい」という用途には向きません。もし順番が大事な場合は、別の仕組み(例えば SortedSet など)を検討する必要があります。HashSetはあくまでも「何が含まれているか、重複はないか」を管理するための道具だと割り切って使うのが、上手にプログラミングするコツです。

7. HashSetとList(Of T)の使い分けまとめ

7. HashSetとList(Of T)の使い分けまとめ
7. HashSetとList(Of T)の使い分けまとめ

最後に、よく使われる「List(リスト)」と今回の「HashSet(ハッシュセット)」の違いを整理しましょう。プログラミング未経験の方は、まずこの二つの違いをなんとなく理解しておくだけで十分です。

特徴 List (リスト) HashSet (ハッシュセット)
重複 許される 許されない
順番 保存される 保存されない
検索速度 データが多いと遅くなる 常に爆速
得意なこと 順番通りに処理する 重複チェック・集合操作

実務では、まずListを使い、もし「重複させたくないな」とか「検索を速くしたいな」と思ったらHashSetに切り替える、という流れが一般的です。VB.NETの多彩なツールを使いこなして、スマートなプログラムを作ってみてくださいね!

カテゴリの一覧へ
新着記事
New1
ASP.NET
ASP.NET Blazor入門!C#で作る最新のWebアプリ開発
New2
VB.NET
VB.NETのStack(スタック)を完全解説!LIFO処理の基本と使い方
New3
VB.NET
VB.NETのキュー(Queue)を完全解説!初心者でもわかるFIFO処理と使い方
New4
VB.NET
VB.NETのNullable型を徹底解説!初心者でもわかる使い方と注意点
人気記事
No.1
Java&Spring記事人気No1
VB.NET
VB.NETの配列(Array)を完全マスター!初心者でも基礎からわかる宣言・初期化ガイド
No.2
Java&Spring記事人気No2
ASP.NET
ASP.NET Coreを.NET CLIで作成する方法を完全解説!初心者でも迷わないコマンド操作入門
No.3
Java&Spring記事人気No3
VB.NET
VB.NETの例外処理で初心者がつまずくポイントと解決策!エラー対策を完全攻略
No.4
Java&Spring記事人気No4
VB.NET
VB.NETのコーディング規約を完全解説!初心者でもわかる読みやすいコードの基本ルール
No.5
Java&Spring記事人気No5
VB.NET
VB.NETでアプリケーション全体の例外をキャッチする方法を完全ガイド
No.6
Java&Spring記事人気No6
ASP.NET
Razor Pagesとは?MVCとの違いをやさしく理解しよう【ASP.NET初心者向け】
No.7
Java&Spring記事人気No7
VB.NET
VB.NETのDictionaryを完全ガイド!初心者でもわかる辞書の基本と応用
No.8
Java&Spring記事人気No8
VB.NET
VB.NETの動的配列とReDimの使い方を徹底解説!サイズ変更のコツ