HashSetクラス・SortedSetクラスには集合演算を行うメソッドとして次のメソッドが用意されています。 いずれも引数としてIEnumerable<T>を取り、戻り値はありません(void)。 したがって、これらのメソッドでは引数に指定された配列やコレクションなどとの演算結果をインスタンス自身に反映します。

集合演算を行うメソッド
メソッド 動作
HashSet.IntersectWith
SortedSet.IntersectWith
現在の集合と引数で指定されたIEnumerable<T>との積集合を求める
(引数の集合と共通する要素のみを残す)
HashSet.UnionWith
SortedSet.UnionWith
現在の集合と引数で指定されたIEnumerable<T>との和集合を求める
(引数の集合の要素をマージする)
HashSet.ExceptWith
SortedSet.ExceptWith
現在の集合と引数で指定されたIEnumerable<T>との差集合を求める
(引数の集合の要素を除外する)
HashSet.SymmetricExceptWith
SortedSet.SymmetricExceptWith
現在の集合と引数で指定されたIEnumerable<T>との対称差を求める
(引数の集合と共通する要素のみを除外する)

以下は、上記の集合演算を使った例です。

HashSetで積集合・和集合・差集合・対象差を求める
Imports System
Imports System.Collections.Generic

Class Sample
  Shared Sub Main()
    Dim set1() As Integer = New Integer() {6, 2, 0, 4, 8}
    Dim set2() As Integer = New Integer() {3, 1, 2, 0, 4}

    ' 積集合を求める(IntersectWith)
    Dim s1 As New HashSet(Of Integer)(set1)

    s1.IntersectWith(set2)

    Console.WriteLine(String.Join(", ", s1))

    ' 和集合を求める(UnionWith)
    Dim s2 As New HashSet(Of Integer)(set1)

    s2.UnionWith(set2)

    Console.WriteLine(String.Join(", ", s2))

    ' 差集合を求める(ExceptWith)
    Dim s3 As New HashSet(Of Integer)(set1)

    s3.ExceptWith(set2)

    Console.WriteLine(String.Join(", ", s3))

    ' 対象差を求める(SymmetricExceptWith)
    Dim s4 As New HashSet(Of Integer)(set1)

    s4.SymmetricExceptWith(set2)

    Console.WriteLine(String.Join(", ", s4))
  End Sub
End Class
実行結果
2, 0, 4
6, 2, 0, 4, 8, 3, 1
6, 8
6, 8, 3, 1

SortedSetで並べ替えが行われる以外は、結果は同じです。

以下の図は、上記のHashSet・SortedSetの集合演算メソッドの実行結果を図式化したものです。

IntersectWithの結果
0 1 3 2 4 6 8 set1 set2
UnionWithの結果
0 1 3 2 4 6 8 set1 set2
ExceptWithの結果
0 1 3 2 4 6 8 set1 set2
SymmetricExceptWithの結果
0 1 3 2 4 6 8 set1 set2