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

การค้นหาในพจนานุกรม

เข้าถึงคีย์-ค่าอย่างรวดเร็ว

การค้นหาในพจนานุกรม เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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