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() |