HomeSearch

C# KeyNotFoundException: Key Not Present in Dictionary

Understand KeyNotFoundException and why it is encountered when using a Dictionary.
KeyNotFoundException. A KeyNotFoundException was thrown. This is likely caused by a lookup done on a key (one that is not present) in a Dictionary collection. As always we want a quick way to fix the problem.ContainsKeyTryGetValueException
Example. Here we see some code that looks correct. But it has a severe flaw. This is the problem: you cannot look up a key that is not found in the Dictionary and try to assign your variable to its value.

Here: The KeyNotFoundException is thrown on the final line of the try-block. The string "test" is not present in the collection.

TryCatch
C# program that throws KeyNotFoundException using System; using System.Collections.Generic; class Program { static void Main() { try { // // Create new Dictionary with string key of "one" // Dictionary<string, string> test = new Dictionary<string, string>(); test.Add("one", "value"); // // Try to access key of "two" // string value = test["two"]; } catch (Exception ex) { // // An exception will be thrown. // Console.WriteLine(ex); } } } Output System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary. at System.ThrowHelper.ThrowKeyNotFoundException() ...
Example 2. We can fix this exception by using the TryGetValue method on the Dictionary type. Note that could use ContainsKey instead of TryGetValue. But we preserve the intention of the previous code here.

Important: We use if-statement when testing values in the Dictionary, because there is always a possibility that the key will not exist.

If

Runtime: The C# compiler cannot detect missing keys. They can only be detected at runtime.

Dictionary
C# program that does not throw using System; using System.Collections.Generic; class Program { static void Main() { Dictionary<string, string> test = new Dictionary<string, string>(); test.Add("one", "value"); // // Use TryGetValue to avoid KeyNotFoundException. // string value; if (test.TryGetValue("two", out value)) { Console.WriteLine("Found"); } else { Console.WriteLine("Not found"); } } } Output Not found
Summary. We saw how to raise and catch the KeyNotFoundException during runtime. We then saw how to avoid causing the exception. We discussed alternatives, such as TryGetValue and ContainsKey, and looked at a program that does not have this problem.
© 2007-2019 Sam Allen. Every person is special and unique. Send bug reports to info@dotnetperls.com.
Home
Dot Net Perls