C#
 Computer >> コンピューター >  >> プログラミング >> C#

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の発生を確実に防止できます。外部入力など不特定のキーを扱う場面では、特にこれらの方法の活用を心がけましょう。

  1. C#でソート済み配列から重複を削除し、重複のない配列を返す方法

    配列がすでにソートされている場合、重複する要素は必ず隣接しています。この性質を利用すると、2つのポインタ(i と j)を使った効率的なアルゴリズムで重複を削除できます。ここで i はゆっくり進む「スローポインタ」、j は速く進む「ファストポインタ」として機能します。 アルゴリズムの手順 nums[i] == nums[j] の間は重複が続いているため、j を1つずつ進めて重複をスキップしていきます。 nums[j] != nums[i] となった時点で、連続した重複が終わったことを意味します。そこで、その値を nums[i + 1] にコピーし、i をインクリメントしてから同じ処理を繰り返しま

  2. C#のKeyNotFoundExceptionとは?発生原因と回避方法をわかりやすく解説

    C#でDictionary(ディクショナリ)コレクションを扱う際、存在しないキーにアクセスするとKeyNotFoundExceptionがスローされます。この記事では、この例外が発生する仕組みを具体的なコード例とともに解説し、あわせて発生を防ぐための対策方法もご紹介します。 KeyNotFoundExceptionが発生する原因 Dictionaryから値を取得する際、指定したキーがコレクション内に存在しない場合にこの例外が発生します。[]演算子によるインデックスアクセスは、内部でget_Itemメソッドを呼び出しており、該当するキーが見つからないときに例外をスローする仕様になっているため