【C#】HashSetが指定されたコレクションの真部分集合かどうかを判定する方法
C#の HashSet<T> クラスには、あるコレクションが別のコレクションに対して「真部分集合(proper subset)」であるかどうかを判定するためのメソッド IsProperSubsetOf() が用意されています。
真部分集合とは、対象となるコレクションのすべての要素を含み、かつ相手側が自分には含まれない要素を少なくとも1つ持っている状態を指します。つまり、2つの集合が完全に一致する場合は「真部分集合」とは見なされず、False が返されます。
この記事では、実際のコード例を使って IsProperSubsetOf() メソッドの使い方と動作を詳しく解説します。
サンプルコード1:真部分集合である場合
以下の例では、set1 のすべての要素(70、100、125、150)が set2 に含まれており、set2 は set1 にない追加の要素も持っているため、set1 は set2 の真部分集合となります。
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(){
HashSet<int> set1 = new HashSet<int>();
set1.Add(70);
set1.Add(100);
set1.Add(125);
set1.Add(150);
Console.WriteLine("HashSet1の要素");
foreach(int val in set1){
Console.WriteLine(val);
}
HashSet<int> set2 = new HashSet<int>();
set2.Add(30);
set2.Add(60);
set2.Add(70);
set2.Add(80);
set2.Add(100);
set2.Add(125);
set2.Add(150);
set2.Add(200);
Console.WriteLine("HashSet2の要素");
foreach(int val in set2){
Console.WriteLine(val);
}
Console.WriteLine("set1はset2の真部分集合か? " + set1.IsProperSubsetOf(set2));
}
}実行結果
HashSet1の要素 70 100 125 150 HashSet2の要素 30 60 70 80 100 125 150 200 set1はset2の真部分集合か? True
set1 の全要素が set2 に含まれ、set2 には set1 に存在しない要素(30、60、80、200)があるため、結果は True になります。
サンプルコード2:真部分集合でない場合
次に、set1 の要素が set2 にまったく含まれていないケースを見てみましょう。この場合、set1 は set2 の部分集合ではないため、結果は False となります。
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(){
HashSet<int> set1 = new HashSet<int>();
set1.Add(10);
set1.Add(20);
Console.WriteLine("HashSet1の要素");
foreach(int val in set1){
Console.WriteLine(val);
}
HashSet<int> set2 = new HashSet<int>();
set2.Add(30);
set2.Add(60);
set2.Add(70);
set2.Add(80);
set2.Add(100);
set2.Add(125);
set2.Add(150);
set2.Add(200);
Console.WriteLine("HashSet2の要素");
foreach(int val in set2){
Console.WriteLine(val);
}
Console.WriteLine("set1はset2の真部分集合か? " + set1.IsProperSubsetOf(set2));
}
}実行結果
HashSet1の要素 10 20 HashSet2の要素 30 60 70 80 100 125 150 200 set1はset2の真部分集合か? False
set1 の要素(10、20)は set2 に存在しないため、set1 は set2 の部分集合とは言えず、結果は False です。
IsProperSubsetOf() メソッドのポイント
- 戻り値: 現在の HashSet オブジェクトが引数で指定したコレクションの真部分集合であれば
true、そうでなければfalseを返します。 - 空の集合の扱い: 空の HashSet は、要素を持つ任意のコレクションの真部分集合と見なされます。
- 重複要素: 引数に渡されるコレクション内に重複する値が含まれていても、判定には影響しません。
- 関連メソッド: 「部分集合であること(同一でも可)」を判定したい場合は
IsSubsetOf()を使用します。IsProperSubsetOf()は両者が同一の場合にfalseを返す点が異なります。
このように、IsProperSubsetOf() メソッドを使えば、集合間の包含関係を簡単かつ効率的にチェックできます。データの妥当性検証や権限チェックなど、集合論的な比較が必要な場面でぜひ活用してください。
-
C#のHashSetとは?重複要素を自動的に削除できるSetコレクションの使い方
C#のHashSetとは C#のHashSet<T>は、System.Collections.Generic名前空間に属する最適化されたセットコレクションです。最大の特徴は、同じ要素(重複する値)を自動的に排除して格納する点にあります。そのため、配列やリストの中から重複した文字列や要素を取り除きたい場合に非常に便利です。 さらに、HashSetは内部でハッシュテーブルを使用しているため、要素の検索・追加・削除が高速に行えるというメリットもあります。 HashSetで重複する文字列を削除するサンプルコード 以下は、C#のHashSetを使って、文字列配列から重複する単語を削除する例
-
JavaのHashSetクラスとは?使い方とサンプルコードを解説
HashSetとはHashSetは、AbstractSetクラスを継承し、Setインターフェースを実装したコレクションクラスです。内部的にはハッシュテーブルを使用して要素を格納します。ハッシュテーブルは「ハッシュ化(hashing)」と呼ばれる仕組みによって情報を管理します。ハッシュ化では、キーの内容をもとに「ハッシュコード」と呼ばれる一意の値が算出されます。このハッシュコードがインデックスとして利用され、キーに関連付けられたデータがその位置に格納されます。キーからハッシュコードへの変換は自動的に行われるため、開発者が意識する必要はありません。HashSetの主な特徴重複した要素は格納できない