C#のKeyNotFoundExceptionとは?発生原因と回避方法をわかりやすく解説
C#でDictionary(ディクショナリ)コレクションを扱う際、存在しないキーにアクセスするとKeyNotFoundExceptionがスローされます。この記事では、この例外が発生する仕組みを具体的なコード例とともに解説し、あわせて発生を防ぐための対策方法もご紹介します。
KeyNotFoundExceptionが発生する原因
Dictionaryから値を取得する際、指定したキーがコレクション内に存在しない場合にこの例外が発生します。[]演算子によるインデックスアクセスは、内部でget_Itemメソッドを呼び出しており、該当するキーが見つからないときに例外をスローする仕様になっているためです。
KeyNotFoundExceptionの発生例
次のコードでは、「Pen Drive」というキーはDictionaryに登録されていないため、実行時にKeyNotFoundExceptionがスローされます。
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
try {
var dict = new Dictionary<string, string>() {
{"TV", "Electronics"},
{"Laptop", "Computers"},
};
Console.WriteLine(dict["Pen Drive"]);
}
catch (Exception e) {
Console.WriteLine(e);
}
}
}
出力結果
実行すると、キーがDictionaryに存在しないため、以下のようなエラーメッセージが出力されます。
System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary. at System.Collections.Generic.Dictionary`2[TKey,TValue].get_Item (TKey key) [0x0001e] in <902ab9e386384bec9c07fa19aa938869>:0
KeyNotFoundExceptionを回避する方法
この例外を防ぐには、キーへのアクセス前に存在確認を行うのが基本です。代表的な方法を2つ紹介します。
1. ContainsKeyメソッドを使う
ContainsKeyでキーの有無を判定してからアクセスすることで、安全に値を取得できます。
if (dict.ContainsKey("Pen Drive")) {
Console.WriteLine(dict["Pen Drive"]);
} else {
Console.WriteLine("キーが存在しません");
}
2. TryGetValueメソッドを使う
TryGetValueを使えば、キーの存在判定と値の取得を一度の呼び出しで行えます。辞書への検索が1回で済むため、パフォーマンス面でも有利です。
if (dict.TryGetValue("Pen Drive", out string value)) {
Console.WriteLine(value);
} else {
Console.WriteLine("キーが存在しません");
}
このように、事前にキーの存在チェックを行うことで、KeyNotFoundExceptionの発生を確実に防止できます。外部入力など不特定のキーを扱う場面では、特にこれらの方法の活用を心がけましょう。
-
C#でソート済み配列から重複を削除し、重複のない配列を返す方法
配列がすでにソートされている場合、重複する要素は必ず隣接しています。この性質を利用すると、2つのポインタ(i と j)を使った効率的なアルゴリズムで重複を削除できます。ここで i はゆっくり進む「スローポインタ」、j は速く進む「ファストポインタ」として機能します。 アルゴリズムの手順 nums[i] == nums[j] の間は重複が続いているため、j を1つずつ進めて重複をスキップしていきます。 nums[j] != nums[i] となった時点で、連続した重複が終わったことを意味します。そこで、その値を nums[i + 1] にコピーし、i をインクリメントしてから同じ処理を繰り返しま
-
C#のKeyNotFoundExceptionとは?発生原因と回避方法をわかりやすく解説
C#でDictionary(ディクショナリ)コレクションを扱う際、存在しないキーにアクセスするとKeyNotFoundExceptionがスローされます。この記事では、この例外が発生する仕組みを具体的なコード例とともに解説し、あわせて発生を防ぐための対策方法もご紹介します。 KeyNotFoundExceptionが発生する原因 Dictionaryから値を取得する際、指定したキーがコレクション内に存在しない場合にこの例外が発生します。[]演算子によるインデックスアクセスは、内部でget_Itemメソッドを呼び出しており、該当するキーが見つからないときに例外をスローする仕様になっているため