LINQ(集合演算)

和集合、積集合、差集合などの集合演算についてまとめる。

メソッド名 機能
Union 和集合
Intersect 積集合(共通部分)
Except 差集合
Distinct 重複する要素を1つにする.

和集合・積集合・差集合

static void Main(string[] args)
{
    var list1 = new List { 1, 3, 5, 7 };
    var list2 = new List { 2, 5, 8 };

    Console.WriteLine($"A = {{{string.Join(",", list1)}}}");
    Console.WriteLine($"B = {{{string.Join(",", list2)}}}");

    var seq1 = list1.Union(list2);
    var seq2 = list1.Intersect(list2);
    var seq3 = list1.Except(list2);

    Console.WriteLine($"和集合 = {{{string.Join(",",seq1)}}}");
    Console.WriteLine($"積集合 = {{{string.Join(",",seq2)}}}");
    Console.WriteLine($"差集合 = {{{string.Join(",",seq3)}}}");

}

実行結果.

A = {1,3,5,7}
B = {2,5,8}
和集合 = {1,3,5,7,2,8}
積集合 = {5}
差集合 = {1,3,7}

Distinct

重複した要素を一つにまとめる時に使用する。

static void Main(string[] args)
{
    var list1 = new List { 1, 1, 2 };
    Console.WriteLine($"A = {{{string.Join(",", list1)}}}");

    var empty = Enumerable.Empty();
    var seq1 = list1.Union(empty);
    var seq2 = list1.Intersect(list1);
    var seq3 = list1.Except(empty);
    var seq4 = list1.Distinct();

    Console.WriteLine($"Aと空集合との和集合 = {{{string.Join(",",seq1)}}}");
    Console.WriteLine($"AとAとの積集合 = {{{string.Join(",",seq2)}}}");
    Console.WriteLine($"Aから空集合を引いた集合 = {{{string.Join(",",seq3)}}}");
    Console.WriteLine($"Distinct = {{{string.Join(",",seq4)}}}");

}

実行結果.

A = {1,1,2}
Aと空集合との和集合 = {1,2}
AとAとの積集合 = {1,2}
Aから空集合を引いた集合 = {1,2}
Distinct = {1,2}

解説

重複要素を取り除くDistinctの意味は分かりやすい。上のコードで注意が必要なのは他のメソッド。
var empty = Enumerable.Empty<int>();
は空のシーケンスなので、seq1はlist1(=A)と空集合との和集合を取っていることになる。 空集合との和集合を取るという操作は意味がなさそうであるが、実行結果を見ると Distinctと同じ結果になっている。つまり、Unionが使用されるとき、自動的に重複要素がまとめられる ということである。積集合や差集合でも同様の効果がある。