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

C#のHashSetからコレクション内のすべての要素を削除する方法

C#のHashSet<T>から、別のコレクションに含まれているすべての要素をまとめて削除したい場合は、ExceptWithメソッドを使用します。このメソッドは、引数に渡したコレクションと重複する要素を現在のHashSetからすべて取り除く、いわゆる「差集合」を求める操作を行います。

ExceptWithメソッドの基本

ExceptWith(IEnumerable<T> other)は、現在のHashSetから指定したコレクションに存在する要素をすべて削除します。処理後のHashSetには、「元のHashSetにのみ含まれていた要素」だけが残ります。なお、この操作は現在のHashSet自体を直接変更する点に注意してください。

サンプルコード

以下の例では、set1に含まれる要素をset2からすべて削除しています。

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main(String[] args){
      HashSet<string> set1 = new HashSet<string>();
      set1.Add("Ryan");
      set1.Add("Tom");
      set1.Add("Andy");
      set1.Add("Tim");

      Console.WriteLine("HashSet1 の要素...");
      foreach (string res in set1){
         Console.WriteLine(res);
      }

      HashSet<string> set2 = new HashSet<string>();
      set2.Add("John");
      set2.Add("Jacob");
      set2.Add("Ryan");
      set2.Add("Tom");
      set2.Add("Andy");
      set2.Add("Tim");
      set2.Add("Steve");
      set2.Add("Mark");

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

      Console.WriteLine("HashSet1 は HashSet2 と等しいか? = " + set1.Equals(set2));

      set2.ExceptWith(set1);

      // set1 に含まれない set2 の要素を表示
      foreach(string i in set2){
         Console.WriteLine(i);
      }
   }
}

実行結果

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

HashSet1 の要素...
Ryan
Tom
Andy
Tim
HashSet2 の要素...
John
Jacob
Ryan
Tom
Andy
Tim
Steve
Mark
HashSet1 は HashSet2 と等しいか? = False
John
Jacob
Steve
Mark

この結果から、set2に含まれていた「Ryan」「Tom」「Andy」「Tim」が削除され、set1に存在しない「John」「Jacob」「Steve」「Mark」だけが残っていることが確認できます。

別の例:部分的に重複する場合

次に、2つのHashSetがほぼ同じ内容で、一部だけ異なるケースを見てみましょう。

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main(String[] args){
      HashSet<string> set1 = new HashSet<string>();
      set1.Add("Jacob");
      set1.Add("Ryan");
      set1.Add("Tom");
      set1.Add("Andy");
      set1.Add("Tim");
      set1.Add("Steve");
      set1.Add("Mark");

      Console.WriteLine("HashSet1 の要素...");
      foreach (string res in set1){
         Console.WriteLine(res);
      }

      HashSet<string> set2 = new HashSet<string>();
      set2.Add("Kevin");
      set2.Add("Jacob");
      set2.Add("Ryan");
      set2.Add("Tom");
      set2.Add("Andy");
      set2.Add("Tim");
      set2.Add("Steve");
      set2.Add("Mark");

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

      Console.WriteLine("HashSet1 は HashSet2 と等しいか? = " + set1.Equals(set2));

      set2.ExceptWith(set1);

      // set1 に含まれない set2 の要素を表示
      foreach(string i in set2){
         Console.WriteLine(i);
      }
   }
}

実行結果

HashSet1 の要素...
Jacob
Ryan
Tom
Andy
Tim
Steve
Mark
HashSet2 の要素...
Kevin
Jacob
Ryan
Tom
Andy
Tim
Steve
Mark
HashSet1 は HashSet2 と等しいか? = False
Kevin

この例では、set2の中でset1と重複しない唯一の要素である「Kevin」だけが残りました。このようにExceptWithを使えば、コレクション間の差分を簡単に抽出できます。

補足:Equalsメソッドとの違い

サンプル内で使用しているEqualsメソッドは、オブジェクト参照の同一性を比較するものであり、HashSetの内容が同じでもFalseが返される点に注意してください。HashSet同士の内容を比較したい場合は、SetEqualsメソッドを使用するのが適切です。


  1. C#でListコレクションから要素を取得する方法

    C#では、List<T>コレクションに格納した要素へ、インデックスを指定するだけで簡単にアクセスできます。本記事では、Listから要素を取得する基本的な方法を、具体的なコード例とともに解説します。 Listへの要素の追加 まず、List<int>型のコレクションを作成し、Addメソッドを使って整数の要素を追加します。 List<int> list = new List<int>(); list.Add(20); list.Add(40); list.Add(60); list.Add(80); インデックスによる要素の取得 リストから特定の

  2. JavaでArrayListのすべての要素を削除する方法(clearメソッドの使い方)

    JavaのArrayListからすべての要素を一括で削除したい場合は、clear()メソッドを使用します。この記事では、実際のコード例を通じて、ArrayListの全要素を削除する手順をわかりやすく解説します。1. 要素を持つArrayListを作成するまず、複数の要素を格納したArrayListを用意しましょう。以下の例では、Integer型のArrayListに7つの数値を追加しています。ArrayList<Integer> arrlist = new ArrayList<Integer>(5); arrlist.add(25); arrlist.add(50);