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

KeyNotFoundException ใน C#: การจัดการข้อยกเว้นเมื่อคีย์ไม่มีใน Dictionary

KeyNotFoundException เป็นข้อยกเว้นที่โยนขึ้นเมื่อพยายามเข้าถึงคีย์ที่ไม่มีอยู่ใน Dictionary<TKey, TValue> เกิดขึ้นเมื่อใช้ดัชนี (dict[key]) กับคีย์ที่ไม่มีอยู่

สาเหตุทั่วไป

  • ใช้ dict[key] โดยไม่ตรวจสอบก่อนว่าคีย์มีอยู่จริง
  • คีย์ถูกลบออกไปก่อนหน้านี้
  • ข้อผิดพลาดในการสะกดคีย์ (Case-sensitive)

โค้ดที่ทำให้เกิดข้อยกเว้น

var dict = new Dictionary
{
    { "TV", "Electronics" },
    { "Laptop", "Computers" }
};

// โค้ดนี้จะโยน KeyNotFoundException
string value = dict["Pen Drive"]; // คีย์นี้ไม่มี!

วิธีป้องกันและจัดการ

1. ใช้ ContainsKey() ตรวจสอบก่อนเข้าถึง

if (dict.ContainsKey("Pen Drive"))
{
    string value = dict["Pen Drive"];
    Console.WriteLine(value);
}
else
{
    Console.WriteLine("ไม่พบคีย์ 'Pen Drive'");
}

2. ใช้ TryGetValue() (แนะนำ - ประสิทธิภาพดีกว่า)

if (dict.TryGetValue("Pen Drive", out string value))
{
    Console.WriteLine($"พบ: {value}");
}
else
{
    Console.WriteLine("ไม่พบคีย์");
}

3. ใช้ null-conditional operator (C# 6+)

string value = dict.GetValueOrDefault("Pen Drive", "ไม่พบข้อมูล");

4. ใช้ try-catch จัดการข้อยกเว้น

try
{
    string value = dict["Pen Drive"];
    Console.WriteLine(value);
}
catch (KeyNotFoundException ex)
{
    Console.WriteLine($"ข้อผิดพลาด: {ex.Message}");
    // หรือ log ข้อผิดพลาด
}

โค้ดตัวอย่างสมบูรณ์

using System;
using System.Collections.Generic;

public class Demo
{
    public static void Main()
    {
        var dict = new Dictionary
        {
            { "TV", "Electronics" },
            { "Laptop", "Computers" }
        };
        
        Console.WriteLine("=== วิธี 1: ContainsKey ===");
        CheckWithContainsKey(dict, "Pen Drive");
        CheckWithContainsKey(dict, "TV");
        
        Console.WriteLine("\n=== วิธี 2: TryGetValue (แนะนำ) ===");
        CheckWithTryGetValue(dict, "Pen Drive");
        CheckWithTryGetValue(dict, "Laptop");
        
        Console.WriteLine("\n=== วิธี 3: GetValueOrDefault ===");
        string val = dict.GetValueOrDefault("Pen Drive", "N/A");
        Console.WriteLine($"Pen Drive: {val}");
        val = dict.GetValueOrDefault("TV", "N/A");
        Console.WriteLine($"TV: {val}");
    }
    
    static void CheckWithContainsKey(Dictionary dict, string key)
    {
        if (dict.ContainsKey(key))
            Console.WriteLine($"{key}: {dict[key]}");
        else
            Console.WriteLine($"{key}: ไม่พบ");
    }
    
    static void CheckWithTryGetValue(Dictionary dict, string key)
    {
        if (dict.TryGetValue(key, out string value))
            Console.WriteLine($"{key}: {value}");
        else
            Console.WriteLine($"{key}: ไม่พบ");
    }
}

ผลลัพธ์

=== วิธี 1: ContainsKey ===
Pen Drive: ไม่พบ
TV: Electronics

=== วิธี 2: TryGetValue (แนะนำ) ===
Pen Drive: ไม่พบ
Laptop: Computers

=== วิธี 3: GetValueOrDefault ===
Pen Drive: N/A
TV: Electronics

สรุปแนวทางปฏิบัติที่ดีที่สุด

สถานการณ์วิธีที่แนะนำ
ต้องการค่าและรู้ว่าคีย์ควรมีอยู่dict[key] (ปล่อยให้โยน Exception หากไม่มี)
ไม่แน่ใจว่าคีย์มีอยู่ ต้องการค่าปลายทางTryGetValue() - เร็วที่สุด ตรวจสอบและดึงค่าในครั้งเดียว
ต้องการค่าเริ่มต้นหากไม่มีคีย์GetValueOrDefault() - สะดวก สั้น
แค่ต้องการเช็คว่ามีคีย์หรือไม่ContainsKey()