目次
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));
以上。
コメントを書く