[C#] Linqの演算で和集合, 差集合, 積集合 を求める方法

[C#] Linqの演算で和集合, 差集合, 積集合 を求める方法

C# で集合(コレクション)に対して演算を行う

C# では Linq を使って、集合に対する演算を行えます。よくベン図で表現されるようなやつを C# で表現できます。

例えば2つの集合を足し合わせた集合を作ったり(和集合)、2つの集合両方に含まれる要素からなる集合を作ったり(積集合)ができます。

ここでは和集合、積集合、差集合を求めてみます。

和集合(Union) いずれかに含まれる

集合 x と y を足し合わせた和集合を作るのが Union です。

var x = new int[] { 1, 2, 3, 4, 5 };
var y = new int[] { 2, 4, 6 };
var z = x.Union(y);

// 1 2 3 4 5 6
Console.WriteLine(string.Join(" ", z));

両方の要素のいずれかに含まれる要素からなる集合(IEnumerable)を作ります。重複する要素は1つにまとめられます。

x.Union(y)y.Union(x) は同じ結果(順序がちがうくらい)です。

単純に結合されたコレクションが欲しいときは Concat() を使います。これなら重複要素もすべて取得できます。和集合ではないですが。

var x = new int[] { 1, 2, 3, 4, 5 };
var y = new int[] { 2, 4, 6 };
var z = x.Concat(y);

// 1 2 3 4 5 2 4 6
Console.WriteLine(string.Join(" ", z));

差集合(Except) 片方にのみ含まれる

集合 x と y の差集合は x に含まれる要素のうち、y に含まれない要素からなる集合です。

var x = new int[] { 1, 2, 3, 4, 5 };
var y = new int[] { 2, 4, 6 };
var z1 = x.Except(y);
var z2 = y.Except(x);

// 1 3 5
Console.WriteLine(string.Join(" ", z1));
// 6
Console.WriteLine(string.Join(" ", z2));

差集合は引き算なので x-y と y-x で結果が異なります。

積集合(Intersect) 両方に含まれる

Intersect は交差するという意味です。2つの集合両方に含まれる要素からなる集合が得られます。

var x = new int[] { 1, 2, 3, 4, 5 };
var y = new int[] { 2, 4, 6 };
var z = x.Intersect(y);

// 2 4
Console.WriteLine(string.Join(", ", z));

以上。

Linqカテゴリの最新記事