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

C#で2つのSortedSetオブジェクトが等しいかどうかを確認する方法

C#で2つのSortedSetオブジェクトが等しいかどうかを確認する方法

C#で2つのSortedSetオブジェクトが等しいかどうかを確認するには、Equals()メソッドを使用します。ただし、このメソッドには重要な注意点があります。SortedSet<T>はEquals()をオーバーライドしていないため、既定の動作である「参照(同一インスタンス)の比較」が行われます。その結果、中身が完全に同じでも、別々に生成したインスタンス同士の比較ではFalseが返されます。以下、具体的なコード例で見ていきましょう。

例1:Equals()メソッドによる比較

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);

      Console.WriteLine("SortedSet1の要素...");
      foreach (int res in set1) {
         Console.WriteLine(res);
      }
      Console.WriteLine("SortedSet1に要素400は含まれるか? = " + set1.Contains(400));

      SortedSet<int> set2 = new SortedSet<int>();
      set2.Add(100);
      set2.Add(200);
      set2.Add(300);
      set2.Add(400);

      Console.WriteLine("SortedSet2の要素...");
      foreach (int res in set2) {
         Console.WriteLine(res);
      }
      Console.WriteLine("SortedSet2に要素500は含まれるか? = " + set2.Contains(500));

      Console.WriteLine("2つのセットは等しいか? = " + set1.Equals(set2));
   }
}

実行結果

SortedSet1の要素...
100
200
300
400
SortedSet1に要素400は含まれるか? = True
SortedSet2の要素...
100
200
300
400
SortedSet2に要素500は含まれるか? = False
2つのセットは等しいか? = False

注目すべきは最後の行です。set1とset2はどちらも「100、200、300、400」という同じ要素を持っていますが、比較結果はFalseになっています。これは、Equals()メソッドが要素の中身ではなく、オブジェクトの参照(同じインスタンスを指しているかどうか)を比較しているためです。

例2:同一インスタンスを代入した場合の比較

次に、一方の変数にもう一方のインスタンスを代入した場合の例を見てみましょう。

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main() {
      SortedSet<int> set1 = new SortedSet<int>();
      set1.Add(10);
      set1.Add(15);
      set1.Add(30);
      set1.Add(50);
      set1.Add(75);
      set1.Add(100);
      set1.Add(150);

      Console.WriteLine("SortedSet1の要素...");
      foreach (int res in set1) {
         Console.WriteLine(res);
      }
      Console.WriteLine("SortedSet1に要素400は含まれるか? = " + set1.Contains(400));

      SortedSet<int> set2 = new SortedSet<int>();
      set2.Add(25);
      set2.Add(50);
      set2.Add(100);
      set2.Add(200);
      set2.Add(400);
      set2.Add(500);

      Console.WriteLine("SortedSet2の要素...");
      foreach (int res in set2) {
         Console.WriteLine(res);
      }

      // set1と同じインスタンスへの参照をset2に代入
      set2 = set1;
      Console.WriteLine("2つのセットは等しいか? = " + set1.Equals(set2));
   }
}

実行結果

SortedSet1の要素...
10
15
30
50
75
100
150
SortedSet1に要素400は含まれるか? = False
SortedSet2の要素...
25
50
100
200
400
500
2つのセットは等しいか? = True

今度は結果がTrueになりました。これは、set2 = set1;によって両方の変数が同じSortedSetインスタンスを参照するようになったためです。つまり、Equals()がTrueを返したのは「要素が一致したから」ではなく、「同一オブジェクトだから」ということになります。

補足:セットの内容を比較したい場合はSetEquals()を使う

「2つのセットが同じ要素を持っているかどうか」を判定したい場合は、SetEquals()メソッドを使用するのが正しい方法です。SetEquals()は各要素の値を実際に比較し、内容が一致していればTrueを返します。

// 例1のset1とset2(同じ要素を持つ別インスタンス)の場合
Console.WriteLine("2つのセットの内容は等しいか? = " + set1.SetEquals(set2));
// 出力:True

このように、C#でSortedSetを比較する際は、目的に応じてメソッドを使い分けることが重要です。同一インスタンスかどうかの判定にはEquals()を、要素の内容が一致しているかの判定にはSetEquals()を使用しましょう。

  1. 【C#】SortedSetに特定の要素が含まれているか確認する方法(Containsメソッドの使い方)

    C#のSortedSet<T>クラスには、指定した要素がセット内に存在するかどうかを判定するためのContainsメソッドが用意されています。この記事では、Containsメソッドを使った具体的なコード例とその実行結果を紹介します。ContainsメソッドとはContains(T item)は、SortedSet内に指定した要素が存在する場合はtrue、存在しない場合はfalseを返すメソッドです。SortedSetは内部でソートされた状態を維持しているため、高速な検索が可能です。サンプルコード1:文字列のSortedSetで要素を検索するまずは、文字列型のSortedSetに対し

  2. C#でSortedSetオブジェクトが指定されたコレクションの真の上位集合(Proper Superset)かどうかを確認する方法

    C#のSortedSet<T>クラスでは、IsProperSupersetOfメソッドを使うことで、あるSortedSetオブジェクトが指定されたコレクションの「真の上位集合(Proper Superset)」であるかどうかを簡単に確認できます。 真の上位集合とは、相手のコレクションに含まれるすべての要素を持ち、かつ相手とは異なる要素を少なくとも1つ以上含む集合のことです。つまり、set2がset1の真の上位集合であるための条件は、「set1の全要素がset2に含まれる」かつ「set2はset1よりも厳密に多くの要素を持つ」となります。条件を満たす場合はtrue、満たさない場合はf