การค้นหาในพจนานุกรม
เข้าถึงคีย์-ค่าอย่างรวดเร็ว
การค้นหาในพจนานุกรม เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คู่คีย์-ค่า
Dictionary<TKey, TValue> จะแมปคีย์ที่ไม่ซ้ำกันเข้ากับค่า ให้คิดว่าเป็นตารางค้นหา คุณส่งคีย์เข้าไปแล้วรับค่ากลับมาได้อย่างรวดเร็ว
โครงสร้างนี้ใช้ตารางแฮชอยู่เบื้องหลัง ดังนั้นการค้นหาค่าด้วยคีย์จึงใช้เวลา O(1) โดยเฉลี่ย ซึ่งเร็วกว่าการสแกนรายการมาก
using System.Collections.Generic;
var ages = new Dictionary<string, int>();
ages["Ann"] = 30;
ages["Bob"] = 25;การกำหนดค่าเริ่มต้นให้ Dictionary
คุณสามารถกำหนดค่าเริ่มต้นให้พจนานุกรมด้วยตัวกำหนดค่าเริ่มต้นของชุดข้อมูล แต่ละรายการจะจับคู่คีย์เข้ากับค่าของคีย์นั้น
คีย์ต้องไม่ซ้ำกัน หากระบุคีย์เดียวกันสองครั้งในตัวกำหนดค่าเริ่มต้น จะทำให้เกิด ArgumentException ขณะโปรแกรมทำงาน
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var caps = new Dictionary<string, string> {
["FR"] = "Paris",
["JP"] = "Tokyo"
};
Console.WriteLine(caps["JP"]);
}
}การอ่านด้วยคีย์
ใช้ตัวเข้าถึงด้วยดัชนีเพื่ออ่านค่า: dict[key] โดยเฉลี่ยมีความซับซ้อน O(1)
แต่โปรดระวัง: หากไม่มีคีย์นั้น ตัวเข้าถึงด้วยดัชนีจะโยน KeyNotFoundException การอ่านคีย์ที่ไม่มีอยู่เป็นข้อผิดพลาดของพจนานุกรมที่พบบ่อยที่สุดอย่างหนึ่ง
var ages = new Dictionary<string, int> { ["Ann"] = 30 };
int a = ages["Ann"]; // 30
// int b = ages["Zoe"]; // throws KeyNotFoundExceptionการค้นหาอย่างปลอดภัยด้วย TryGetValue
TryGetValue ช่วยหลีกเลี่ยงข้อยกเว้น โดยจะคืนค่า true และกำหนดค่าให้ตัวแปร out เมื่อมีคีย์นั้นอยู่ หรือคืนค่า false หากไม่มีกุญแจ
นี่เป็นวิธีมาตรฐานของภาษาสำหรับค้นหาค่าที่อาจมีหรือไม่มีอยู่ โดยไม่จัดสรรหน่วยความจำ
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var ages = new Dictionary<string, int> { ["Ann"] = 30 };
if (ages.TryGetValue("Ann", out int v))
Console.WriteLine(v);
}
}ContainsKey และค่าเริ่มต้น
ContainsKey ตรวจสอบว่ามีคีย์อยู่หรือไม่โดยไม่อ่านค่า และมีความซับซ้อน O(1) ใช้ก่อนอ่านด้วยตัวเข้าถึงด้วยดัชนีเมื่อคุณต้องการเพียงคำตอบว่ามีหรือไม่มี
หากเรียกทั้ง ContainsKey และตัวเข้าถึงด้วยดัชนี คุณจะคำนวณแฮชของคีย์สองครั้ง ส่วน TryGetValue ทำเพียงครั้งเดียว จึงมักทำงานได้เร็วกว่า
var ages = new Dictionary<string, int> { ["Ann"] = 30 };
if (ages.ContainsKey("Ann"))
System.Console.WriteLine(ages["Ann"]);การเพิ่มเทียบกับการกำหนดค่า
ตัวเข้าถึงด้วยดัชนี dict[key] = value จะแทรกคู่ข้อมูลใหม่หรือเขียนทับคู่ข้อมูลเดิม ส่วน Add(key, value) จะแทรกข้อมูลเท่านั้น และจะโยนข้อยกเว้นหากมีคีย์นั้นอยู่แล้ว
ใช้ Add เมื่อคีย์ซ้ำควรถือเป็นข้อผิดพลาด และใช้ตัวเข้าถึงด้วยดัชนีเมื่อการเขียนทับเป็นสิ่งที่ยอมรับได้
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var d = new Dictionary<string, int>();
d["x"] = 1;
d["x"] = 2; // overwrite, fine
Console.WriteLine(d["x"]);
}
}การลบรายการ
Remove(key) ลบคู่ข้อมูลและคืนค่า true หากมีคีย์นั้นอยู่ โดยเฉลี่ยมีความซับซ้อน O(1)
มีรูปแบบหนึ่งที่คืนค่าที่ลบออกผ่านพารามิเตอร์ out ซึ่งมีประโยชน์เมื่อคุณต้องการลบข้อมูลและนำค่าไปใช้ในขั้นตอนเดียว
var d = new Dictionary<string, int> { ["a"] = 1, ["b"] = 2 };
bool removed = d.Remove("a"); // true
bool again = d.Remove("a"); // falseการวนซ้ำคู่ข้อมูล
การวนลูปจะให้รายการชนิด KeyValuePair<TKey, TValue> คุณสามารถแยกรายการเหล่านี้ออกเป็นคีย์และค่าเพื่อให้โค้ดอ่านง่าย
ไม่รับประกันลำดับการวนอ่าน ดังนั้นอย่าพึ่งพาลำดับที่รายการถูกแทรก ใช้ Keys หรือ Values หากต้องการวนอ่านเพียงด้านใดด้านหนึ่ง
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var d = new Dictionary<string, int> { ["a"] = 1, ["b"] = 2 };
foreach (var (key, val) in d)
Console.WriteLine($"{key}={val}");
}
}การนับด้วยพจนานุกรม
การใช้งานแบบคลาสสิกคือการนับจำนวนครั้งที่สิ่งต่าง ๆ ปรากฏขึ้น สำหรับแต่ละรายการ ให้เพิ่มจำนวนของรายการนั้น โดยเริ่มจากศูนย์หากเป็นรายการใหม่
รูปแบบนี้ทำงานใน O(n) สำหรับรายการ n รายการ เพราะการค้นหาและการปรับปรุงแต่ละครั้งมีความซับซ้อน O(1) เทียบกับ O(n ยกกำลังสอง) หากคุณไล่ตรวจรายการทุกครั้ง
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var counts = new Dictionary<char, int>();
foreach (char c in "banana")
counts[c] = counts.GetValueOrDefault(c) + 1;
Console.WriteLine(counts['a']);
}
}ความเท่ากันของคีย์มีความสำคัญ
การค้นหาอาศัย GetHashCode และ Equals ของชนิดคีย์ ชนิดข้อมูลในตัวและ string ใช้งานได้ทันที
สำหรับคีย์ที่เป็นคลาสแบบกำหนดเอง ให้เขียนทับทั้งสองเมธอดหรือใช้ record มิฉะนั้นคีย์สองตัวที่ดูเท่ากันจะได้ค่าแฮชต่างกัน และการค้นหาจะล้มเหลว
var byName = new Dictionary<string, int>(
System.StringComparer.OrdinalIgnoreCase);
byName["Hi"] = 1;
bool found = byName.ContainsKey("HI"); // trueการเลือกชนิดค่า
ค่าต่าง ๆ สามารถเป็นอะไรก็ได้ รวมถึงรายการหลายค่า โครงสร้าง Dictionary<string, List<int>> ใช้จัดกลุ่มค่าจำนวนมากไว้ภายใต้คีย์เดียว
เมื่อแทรกข้อมูลลงในโครงสร้างเช่นนี้ ให้สร้างรายการด้านในเมื่อใช้งานครั้งแรก จากนั้นจึงเพิ่มข้อมูลลงไป วิธีนี้จะสร้างแผนผังแบบจัดกลุ่มที่รองรับหลายค่าต่อคีย์
var groups = new Dictionary<string, List<int>>();
void Add(string k, int v) {
if (!groups.TryGetValue(k, out var list))
groups[k] = list = new List<int>();
list.Add(v);
}ตรวจสอบความเข้าใจ
เลือกวิธีที่ปลอดภัยที่สุดในการอ่านคีย์ที่อาจไม่มีอยู่
ทบทวน
Dictionary<K,V> ให้การค้นหา การแทรก และการลบด้วยคีย์โดยเฉลี่ยใน O(1) โดยมีตารางแฮชอยู่เบื้องหลัง
เลือกใช้ TryGetValue แทนตัวเข้าถึงด้วยดัชนีที่อาจโยนข้อยกเว้น รักษาคีย์ให้ไม่ซ้ำกัน และตรวจสอบให้ชนิดคีย์แบบกำหนดเองใช้การเปรียบเทียบความเท่ากันและการคำนวณแฮชอย่างถูกต้อง ลำดับการวนอ่านไม่ได้กำหนดไว้
คำถามที่พบบ่อย
บทเรียน “การค้นหาในพจนานุกรม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การค้นหาในพจนานุกรม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การค้นหาในพจนานุกรม”
เข้าถึงคีย์-ค่าอย่างรวดเร็ว คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การค้นหาในพจนานุกรม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การใช้งานรายการจริง
- การค้นหาในพจนานุกรม
- HashSet และความไม่ซ้ำกัน
- เลือกคอลเลกชัน