Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

ตรวจสอบว่า HashSet เป็น Superset ของคอลเลกชันที่ระบุใน C#

เมธอด IsSupersetOf(IEnumerable<T> other) ของ HashSet<T> คืนค่า true หาก HashSet ปัจจุบันมีองค์ประกอบ **ครบถ้วนของ other** (อาจมีเพิ่มเติมได้) - คือ Superset (A ⊇ B)

ตัวอย่างที่ 1: HashSet<string> เป็น Superset

using System;
using System.Collections.Generic;

public class Demo
{
    public static void Main()
    {
        HashSet<string> set1 = new HashSet<string>();
        set1.Add("AB");
        set1.Add("CD");
        set1.Add("EF");
        set1.Add("AB"); // ซ้ำ
        set1.Add("IJ");
        set1.Add("KL");
        set1.Add("EF"); // ซ้ำ
        set1.Add("OP");

        Console.WriteLine("องค์ประกอบใน HashSet1:");
        foreach (string val in set1)
        {
            Console.WriteLine(val);
        }

        HashSet<string> set2 = new HashSet<string>();
        set2.Add("EF");
        set2.Add("KL");

        Console.WriteLine("องค์ประกอบใน HashSet2:");
        foreach (string val in set2)
        {
            Console.WriteLine(val);
        }

        // set1 มี EF, KL และมีเพิ่ม -> Superset
        Console.WriteLine("set1 เป็น Superset ของ set2? " + set1.IsSupersetOf(set2));
    }
}

ผลลัพธ์

องค์ประกอบใน HashSet1
AB
CD
EF
IJ
KL
OP
องค์ประกอบใน HashSet2
EF
KL
set1 เป็น Superset ของ set2? True

ตัวอย่างที่ 2: HashSet ไม่ใช่ Superset

using System;
using System.Collections.Generic;

public class Demo
{
    public static void Main()
    {
        HashSet<string> set1 = new HashSet<string>();
        set1.Add("IJ");
        set1.Add("KL");
        set1.Add("EF");
        set1.Add("OP");

        Console.WriteLine("องค์ประกอบใน HashSet1:");
        foreach (string val in set1)
        {
            Console.WriteLine(val);
        }

        HashSet<string> set2 = new HashSet<string>();
        set2.Add("KL");
        set2.Add("MN");
        set2.Add("OP");
        set2.Add("QR");

        Console.WriteLine("องค์ประกอบใน HashSet2:");
        foreach (string val in set2)
        {
            Console.WriteLine(val);
        }

        // set1 ไม่มี MN, QR -> ไม่ใช่ Superset
        Console.WriteLine("set1 เป็น Superset ของ set2? " + set1.IsSupersetOf(set2));
    }
}

ผลลัพธ์

องค์ประกอบใน HashSet1
IJ
KL
EF
OP
องค์ประกอบใน HashSet2
KL
MN
OP
QR
set1 เป็น Superset ของ set2? False

ตารางเปรียบเทียบ Set Operations (HashSet & SortedSet)

เมธอดสัญลักษณ์ความหมายA={1,2,3}, B={1,2}
IsSubsetOfA ⊆ BA เป็นสับเซตของ BFalse
IsProperSubsetOfA ⊂ BA โพรเพอร์สับเซต (≠)False
IsSupersetOfA ⊇ BA ซูเปอร์เซตของ B (รวมเท่ากัน)True
IsProperSupersetOfA ⊃ BA โพรเพอร์ซูเปอร์เซต (≠)True
OverlapsA ∩ B ≠ ∅มีสมาชิกร่วม ≥ 1True
SetEqualsA = BสมาชิกเหมือนกันหมดFalse

เมธอดแก้ไขเซต (Mutating) - In-Place

เมธอดคำอธิบายSet Operation
UnionWithรวม (A ∪ B)A = A ∪ B
IntersectWithเก็บร่วม (A ∩ B)A = A ∩ B
ExceptWithลบที่อยู่ใน B (A \ B)A = A \ B
SymmetricExceptWithเก็บเฉพาะฝั่งเดียว (A Δ B)A = (A \ B) ∪ (B \ A)

ข้อสังเกต

  • IsSupersetOf รับ IEnumerable<T>> ใดๆ ก็ได้ (List, Array, HashSet, SortedSet, v.v.)
  • Complexity: O(n) โดยประมาณ (n = ขนาด other) เนื่องจากต้อง Contains ทุกตัว
  • HashSet ให้ O(1) Average สำหรับ Contains -> เร็วกว่า SortedSet (O(log n)) สำหรับข้อมูลเยอะ
  • SortedSet ให้ลำดับเรียง ฟรี แต่ช้ากว่าเล็กน้อย
  • เลือก HashSet สำหรับ Performance, SortedSet สำหรับ Ordered Data