0Pricing
C# Academy · บทเรียน

HashSet และความไม่ซ้ำกัน

ติดตามค่าที่แตกต่างกัน

HashSet และความไม่ซ้ำกัน เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

HashSet คืออะไร

HashSet<T> เก็บชุดค่าที่ไม่ซ้ำกันและไม่มีค่าซ้ำ การเพิ่มค่าที่มีอยู่แล้วจะไม่ทำอะไร

เช่นเดียวกับพจนานุกรม โครงสร้างนี้มีตารางแฮชอยู่เบื้องหลัง ดังนั้นการตรวจสอบสมาชิกจึงมีความซับซ้อนโดยเฉลี่ย O(1) และไม่มีการรักษาลำดับการแทรก

using System.Collections.Generic;

var seen = new HashSet<int>();
seen.Add(1);
seen.Add(1); // ignored, still one element

Add คืนค่าบูลีน

Add คืนค่า true หากค่าเป็นค่าใหม่ และคืนค่า false หากมีค่านั้นอยู่แล้ว

ค่าที่คืนมานี้มีประโยชน์สำหรับตรวจหาค่าซ้ำในขั้นตอนเดียว โดยไม่ต้องเรียกใช้ Contains แยกต่างหาก

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var set = new HashSet<string>();
        Console.WriteLine(set.Add("a")); // True
        Console.WriteLine(set.Add("a")); // False
    }
}

การตรวจสอบการมีอยู่ที่รวดเร็ว

Contains บน HashSet มีความซับซ้อนโดยเฉลี่ย O(1) เทียบกับ O(n) บนรายการ

เมื่อคุณถามซ้ำ ๆ ว่า “เคยเห็นค่านี้แล้วหรือยัง” set คือเครื่องมือที่เหมาะสม ความแตกต่างด้านความเร็วจะเพิ่มขึ้นอย่างมากเมื่อชุดข้อมูลมีขนาดใหญ่

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var ids = new HashSet<int> { 10, 20, 30 };
        Console.WriteLine(ids.Contains(20)); // True
        Console.WriteLine(ids.Contains(99)); // False
    }
}

การลบค่าซ้ำออกจากรายการ

งานที่พบบ่อยคือการรับรายการมาแล้วเก็บไว้เฉพาะค่าที่แตกต่างกัน การสร้าง HashSet จากรายการจะทำงานนี้ให้ใน O(n)

set ผลลัพธ์จะมีแต่ละค่าเพียงครั้งเดียว หากต้องการรายการกลับคืนมา ให้ครอบด้วย new List<int>(set)

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 1, 2, 2, 3, 3, 3 };
        var unique = new HashSet<int>(nums);
        Console.WriteLine(unique.Count); // 3
    }
}

การรวม

UnionWith เพิ่มสมาชิกทุกตัวจากชุดข้อมูลอื่น โดยข้ามค่าซ้ำ ผลลัพธ์จะมีข้อมูลทั้งหมดจากทั้งสองชุด

การดำเนินการนี้เปลี่ยนแปลง set เดิมโดยตรง สะอาดกว่าการวนลูปแล้วเรียกใช้ Add กับแต่ละรายการด้วยตนเองมาก

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var a = new HashSet<int> { 1, 2, 3 };
        a.UnionWith(new[] { 3, 4, 5 });
        Console.WriteLine(a.Count); // 5
    }
}

ส่วนร่วม

IntersectWith เก็บไว้เฉพาะสมาชิกที่ปรากฏอยู่ในชุดข้อมูลอื่นด้วย และลบสมาชิกที่เหลือออก

ใช้เพื่อค้นหารายการที่มีร่วมกัน เช่น แท็กที่บทความสองบทความใช้ร่วมกัน หรือผู้ใช้ที่อยู่ในทั้งสองกลุ่ม

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var a = new HashSet<int> { 1, 2, 3, 4 };
        a.IntersectWith(new[] { 2, 4, 6 });
        Console.WriteLine(string.Join(",", a)); // 2,4
    }
}

ผลต่าง

ExceptWith ลบสมาชิกใด ๆ ออกจาก set หากพบสมาชิกนั้นในชุดข้อมูลอื่น เหลือไว้เฉพาะสิ่งที่มีอยู่ใน set นี้เท่านั้น

นี่คือการดำเนินการลบเซต: “รายการที่อยู่ใน A แต่ไม่อยู่ใน B” เหมาะสำหรับคำนวณสิ่งที่เปลี่ยนแปลงหรือสิ่งที่เหลือให้ประมวลผล

var a = new HashSet<int> { 1, 2, 3, 4 };
a.ExceptWith(new[] { 2, 4 });
// a now contains 1 and 3

เซตย่อยและเซตเหนือ

IsSubsetOf และ IsSupersetOf ตรวจสอบความสัมพันธ์ด้านการบรรจุระหว่างเซต และคืนค่าเป็น bool

Overlaps ตรวจสอบว่ามีสมาชิกใดใช้ร่วมกันหรือไม่ ส่วน SetEquals ตรวจสอบว่าเซตสองเซตมีสมาชิกเหมือนกันทุกประการโดยไม่สนใจลำดับหรือไม่

var a = new HashSet<int> { 1, 2 };
var b = new HashSet<int> { 1, 2, 3 };
bool sub = a.IsSubsetOf(b);   // true
bool ov = a.Overlaps(b);      // true

ความเท่ากันของสมาชิก

ความไม่ซ้ำกันขึ้นอยู่กับ GetHashCode และ Equals ของชนิดสมาชิก เช่นเดียวกับคีย์ของพจนานุกรมทุกประการ

สำหรับชนิดข้อมูลแบบกำหนดเอง ให้เขียนทับทั้งสองอย่างหรือใช้ record มิฉะนั้นออบเจ็กต์สองตัวที่เท่ากันในเชิงตรรกะจะถูกมองว่าแตกต่างกัน และทั้งคู่จะลงเอยอยู่ใน set

var names = new HashSet<string>(
    System.StringComparer.OrdinalIgnoreCase);
names.Add("Sam");
bool dup = !names.Add("SAM"); // true: treated as same

ไม่มีการเข้าถึงด้วยดัชนีหรือลำดับ

HashSet ไม่มีการเข้าถึงด้วยดัชนี คุณไม่สามารถเขียน set[0] ได้ และทำได้เพียงวนอ่านด้วย foreach

ไม่รับประกันลำดับการวนอ่าน หากต้องการทั้งความไม่ซ้ำกันและลำดับที่เรียงแล้ว ให้ใช้ SortedSet<T> ซึ่งรักษาลำดับของสมาชิกไว้ แต่มีต้นทุนการดำเนินการ O(log n)

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var s = new SortedSet<int> { 3, 1, 2 };
        Console.WriteLine(string.Join(",", s)); // 1,2,3
    }
}

การติดตามรายการที่พบแล้ว

รูปแบบที่พบบ่อยคือการกรองกระแสข้อมูลเพื่อให้แต่ละค่าปรากฏเพียงครั้งเดียว เพิ่มค่าลงใน set และดำเนินการเฉพาะเมื่อ Add คืนค่า true

วิธีนี้สะอาดและเร็วกว่าการตรวจสอบรายการที่ขยายใหญ่ขึ้นเรื่อย ๆ โดยเปลี่ยนการไล่ตรวจจาก O(n ยกกำลังสอง) เป็น O(n)

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var seen = new HashSet<int>();
        foreach (int x in new[] { 1, 1, 2, 3, 2 })
            if (seen.Add(x)) Console.Write(x + " ");
        // prints 1 2 3
    }
}

ตรวจสอบความเข้าใจ

ทบทวนสิ่งที่ HashSet บังคับใช้และต้นทุนการค้นหาของมัน

ทบทวน

HashSet<T> เก็บค่าที่ไม่ซ้ำกัน โดยการเพิ่ม การลบ และการตรวจสอบการมีอยู่มีความซับซ้อนโดยเฉลี่ย O(1) แต่ไม่มีลำดับหรือการเข้าถึงด้วยดัชนี

เหมาะอย่างยิ่งสำหรับการกำจัดค่าซ้ำ การตรวจสอบอย่างรวดเร็วว่า “เคยเห็นค่านี้แล้วหรือยัง” และพีชคณิตของ set ผ่าน UnionWith, IntersectWith และ ExceptWith ชนิดสมาชิกแบบกำหนดเองต้องใช้การเปรียบเทียบความเท่ากันอย่างถูกต้อง

คำถามที่พบบ่อย

บทเรียน “HashSet และความไม่ซ้ำกัน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “HashSet และความไม่ซ้ำกัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “HashSet และความไม่ซ้ำกัน”

ติดตามค่าที่แตกต่างกัน คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “HashSet และความไม่ซ้ำกัน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การใช้งานรายการจริง
  2. การค้นหาในพจนานุกรม
  3. HashSet และความไม่ซ้ำกัน
  4. เลือกคอลเลกชัน
← กลับไปที่ C# Academy