C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でSortedSetとコレクションの和集合(Union)を求める方法

C#のSortedSet<T>と別のコレクションの和集合(Union)を計算するには、UnionWithメソッドを使用します。このメソッドは、呼び出し元のSortedSetそのものを、指定したコレクションとの和集合の結果で書き換えます。

UnionWithメソッドとは

UnionWith(IEnumerable<T> other)は、現在のセットを「現在のセットと指定されたコレクションのどちらかに存在するすべての要素(重複は除外)」で構成されるように変更するメソッドです。引数には、別のSortedSetだけでなく、List<T>や配列など任意のIEnumerable<T>を渡すことができます。

例1:2つのSortedSetの和集合

using System;
using System.Collections.Generic;
public class Demo {
    public static void Main() {
        SortedSet<int> set1 = new SortedSet<int>();
        set1.Add(50);
        set1.Add(100);
        set1.Add(150);
        Console.WriteLine("SortedSet1 elements...");
        foreach(int ele in set1) {
            Console.WriteLine(ele);
        }
        SortedSet<int> set2 = new SortedSet<int>();
        set2.Add(100);
        set2.Add(150);
        set2.Add(200);
        set2.Add(250);
        Console.WriteLine("SortedSet2 elements...");
        foreach(int ele in set2) {
            Console.WriteLine(ele);
        }
        Console.WriteLine("Union...");
        set1.UnionWith(set2);
        foreach(int ele in set1) {
            Console.WriteLine(ele);
        }
    }
}

出力

上記のコードを実行すると、次のような出力が得られます。

SortedSet1 elements...
50
100
150
SortedSet2 elements...
100
150
200
250
Union...
50
100
150
200
250

実行結果の解説

set1には「50・100・150」、set2には「100・150・200・250」が格納されています。UnionWith(set2)を実行すると、両方のセットに共通して存在する100と150は1つにまとめられ、重複のない「50・100・150・200・250」という結果になります。また、SortedSetは常に要素をソートされた状態で保持するため、和集合の結果も自動的に昇順に並びます。

例2:同じ要素を持つ2つのSortedSetの和集合

続いて、2つのセットが完全に同じ要素を持つ場合の例を見てみましょう。

using System;
using System.Collections.Generic;
public class Demo {
    public static void Main() {
        SortedSet<int> set1 = new SortedSet<int>();
        set1.Add(100);
        set1.Add(200);
        set1.Add(300);
        set1.Add(400);
        set1.Add(500);
        set1.Add(600);
        Console.WriteLine("SortedSet1 elements...");
        foreach(int ele in set1) {
            Console.WriteLine(ele);
        }
        SortedSet<int> set2 = new SortedSet<int>();
        set2.Add(100);
        set2.Add(200);
        set2.Add(300);
        set2.Add(400);
        set2.Add(500);
        set2.Add(600);
        Console.WriteLine("SortedSet2 elements...");
        foreach(int ele in set2) {
            Console.WriteLine(ele);
        }
        Console.WriteLine("Union...");
        set1.UnionWith(set2);
        foreach(int ele in set1) {
            Console.WriteLine(ele);
        }
    }
}

出力

このコードの出力は次のとおりです。

SortedSet1 elements...
100
200
300
400
500
600
SortedSet2 elements...
100
200
300
400
500
600
Union...
100
200
300
400
500
600

実行結果の解説

この例では、set1とset2がまったく同じ要素を持っているため、和集合を計算しても結果は変わりません。セットは本質的に重複を許さないデータ構造であるため、同一要素どうしの和集合では元のセットと同じ内容が保たれます。

押さえておきたいポイント

  • 破壊的な操作: UnionWithは戻り値を返さず、呼び出し元のセット自体が更新されます。元のセットを残したい場合は、事前にコピーを作成しておきましょう。
  • 重複の自動排除: 和集合の結果には重複した要素が含まれません。
  • 常にソート済み: SortedSetの特性により、結果は常に昇順に整列されます。
  • 柔軟な引数: 引数にはIEnumerable<T>を実装する任意のコレクション(List、配列など)を指定できます。
  1. 【C#】SortedSetオブジェクトが指定されたコレクションの真部分集合かどうかを確認する方法

    C#では、SortedSet<T>クラスに用意されているIsProperSubsetOfメソッドを使うことで、あるSortedSetオブジェクトが指定されたコレクションの真部分集合(プロパー・サブセット)であるかどうかを簡単に確認できます。 真部分集合とは、基準となるコレクションのすべての要素を含みながら、そのコレクションそのものとは一致しない集合のことです。つまり、2つのセットがまったく同じ要素を持つ場合は、たとえ一方が他方の部分集合であっても「真部分集合」にはなりません。このメソッドは条件を満たす場合にtrue、満たさない場合にfalseを返します。 例1:真部分集合であるケー

  2. C#でHashSetと指定されたコレクションに共通の要素があるか確認する方法

    C#において、HashSetと指定されたコレクションとの間に共通の要素が存在するかどうかを確認したい場合は、Overlaps() メソッドを使用します。Overlaps() メソッドは、HashSetと引数で渡されたコレクションの間に共通する要素が1つでも存在すれば true を返し、まったく存在しなければ false を返します。このメソッドは System.Collections.Generic 名前空間に含まれており、引数として IEnumerable<T> 型のコレクションを受け取ります。例1:int型のHashSetの場合まずは、整数値を格納した2つのHashSetで共通