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 elementAdd คืนค่าบูลีน
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การใช้งานรายการจริง
- การค้นหาในพจนานุกรม
- HashSet และความไม่ซ้ำกัน
- เลือกคอลเลกชัน