【C#】指定されたキーはディレクトリ内に存在しませんでした。の解決方法【KeyNotFoundException】
C#で発生するエラー(例外)
System.Collections.Generic.KeyNotFoundException: 指定されたキーはディレクトリ内に存在しませんでした。
上記のエラー(例外)が発生したときの解決方法をご紹介します。
下記にC#で発生する例外処理の一覧をまとめていますので解決できない場合は合わせてご確認ください。
⇒例外処理クラス一覧まとめ【原因と解決方法】
C#のおすすめ講座を受講して、最短1週間でC#をマスターしよう!
⇒C#が学べるおすすめプログラミングスクール&オンライン講座11選
【C#】指定されたキーはディレクトリ内に存在しませんでした。のエラーの原因
「System.Collections.Generic.KeyNotFoundException: 指定されたキーはディレクトリ内に存在しませんでした。」
のエラーの原因は
コレクション内の要素にアクセスするために指定したキーが、コレクションに存在しない
からです。
エラーコードの例を見て具体的に確認してみましょう。
var dic = new Dictionary<string, string>();
dic.Add("1", "orange");
dic.Add("2", "apple");
dic.Add("3", "grape");
System.Console.WriteLine(dic["4"]);//指定したキーが存在しないため、エラーが発生する
ディクショナリー(Dictionary)はキーと値のペア(KeyValuePair)のコレクションになります。
リストのがキー(Key)がインデックスを表し、値(Value)は要素の値を指します。※(Dictionary<key, Value>())
(dic[“4"])のように存在しないキー値を設定するとKeyNotFoundExceptionエラーが発生します。
このようにキー(Key)に存在しない値を指定できません。
エラーのイメージは下記の通りです。
上記のようにコレクション内の要素にアクセスするために指定したキーがコレクションに存在しない場合にエラーが発生します。
「System.Collections.Generic.KeyNotFoundException:」の詳細はこちらから
【C#】指定されたキーはディレクトリ内に存在しませんでした。エラーの解決方法
「System.Collections.Generic.KeyNotFoundException: 指定されたキーはディレクトリ内に存在しませんでした。」のエラーを解決する方法をご紹介します。
①存在するキーを添え字に設定する
var dic = new Dictionary<string, string>();
dic.Add("1", "orange");
dic.Add("2", "apple");
dic.Add("3", "grape");
System.Console.WriteLine(dic[3"]);//指定したキーがコレクション内に存在するため、エラーが解消される
上記dic[3″]のように存在するキーの値をインデクサに設定するとエラーが解消されます。
②ContainsKeyメソッドを呼びだし、存在するキーか事前にチェックする
var dic = new Dictionary<string, string>();
dic.Add("1", "orange");
dic.Add("2", "apple");
dic.Add("3", "grape");
if (dic.ContainsKey("4"))
{
//存在しないキーのため、if文内は実行されない。エラー回避
System.Console.WriteLine(dic["4"]);
}
上記のように、if文内でContainsKeyメソッドを呼び出し、キーの存在チェックを行います。
ContainsKeyはキーの存在チェックを行うメソッドで、キーが存在すればtrue、存在しなければfalseを返します。
キーが存在していればif文内に侵入し、存在しなければ処理を実行しないため、
ContainsKeyを活用すれば事前にエラーを防止することができます。
③TryGetValueメソッドを呼び出し、存在するキーか事前にチェックする
var dic = new Dictionary<string, string>();
dic.Add("1", "orange");
dic.Add("2", "apple");
dic.Add("3", "grape");
string dicName;
if (dic.TryGetValue("4",out dicName))
{
//存在しないキーのため、if文内は実行されない。エラー回避
System.Console.WriteLine(dicName);//TryGetValueで取得したバリュー値(dicName)を表示する
}
上記のように、if文内でTryGetValueメソッドを呼び出し、キーの存在チェックを行います。
TryGetValueはキーの存在チェックを行うメソッドで、キーが存在すればtrueと検索したキー値を返却します。
キーが存在していればif文内に侵入し、存在しなければ処理を実行しないため、
TryGetValueを活用すれば事前にエラーを防止することができます。
ContainsKeyとTryGetValueどちらを採用すれば良いか?
エラーの解決方法にContainsKeyとTryGetValueを紹介しました。
どちらも事前チェックを行いエラーを回避するという対策方法です。
どちらの対策方法を採用すれば良いでしょうか?
個人的にはTryGetValueをお勧めします。
TryGetValueを用いればkeyルックアップが1回で済みます。※keyルックアップ=キー参照
keyルックアップはあまり早い処理ではないので、処理速度を高めたい場合にはお勧めしません。
そのため処理速度が向上を願うならTryGetValueを使うべし。です。
エラーを解決できなくて途方に暮れている人へ。
■無料プログラミング講座を開設しています!
下記にVisual Studioを使ったC#プログラミング初心者向け完全ガイドを掲載しています。
このガイドを一通り勉強すれば、C#プログラミングの基礎が学べます。
是非チャレンジしてみてください!
プログラミング初心者の方はぜひチャレンジしてみてください!!