C# TryGetValue (Get Value From Dictionary)

Use the TryGetValue method on Dictionary to test a key, and get a value.

dot net perls

TryGetValue. This method optimizes Dictionary usage. It gets a value (at a key) from a Dictionary. And it eliminates unneeded lookups, making programs better.ContainsKeyContainsValue

Some notes. With TryGetValue, we can combine the "try" part of seeing if a key exists, and the "get" part of getting the existing value. This saves 1 lookup.Dictionary

TryGetValue, example. We can rewrite programs that use ContainsKey with TryGetValue. By combining 2 operations (try and get) into 1, we can optimize and simplify programs.
Important: Every lookup has to compute the hash code, which has a performance penalty. The TryGetValue method can help here.
Value: Look carefully at "value" in this program. It is accessed by TryGetValue, and we do not need to get it again when we use it.
C# program that uses TryGetValue using System; using System.Collections.Generic; class Program { static void Main() { var counts = new Dictionary<string, int>(); counts.Add("key", 0); // Keep the result of TryGetValue. int value; if (counts.TryGetValue("key", out value)) { counts["key"] = value + 1; Console.WriteLine("VALUE: " + counts["key"]); } } } Output VALUE: 1

Out type. The second argument to TryGetValue is an out parameter. We can specify the type (here it is bool) directly in the call to the TryGetValue method.Out
C# program that shows inline out type using System; using System.Collections.Generic; class Program { static void Main() { var ids = new Dictionary<string, bool>() { { "X1", true } }; // We can specify the "out" type by argument. if (ids.TryGetValue("X1", out bool result)) { Console.WriteLine($"VALUE: {result}"); } } } Output VALUE: True

Benchmark, TryGetValue. This benchmark compares the TryGetValue method against ContainsKey and indexer. It compares 1 lookup against 2 lookups.Benchmark
Version 1: Use ContainsKey. If the key exists, access the value again in a separate lookup statement.
Version 2: This version of the code uses TryGetValue, and stores the result value which is then used for the sum.
Result: It is faster to just use the TryGetValue method and access the already-known value from a local variable.
C# program that benchmarks ContainsKey and TryGetValue using System; using System.Collections.Generic; using System.Diagnostics; class Program { const int _max = 10000000; static void Main() { var test = new Dictionary<string, int>(); test["key"] = 1; int sum = 0; // Version 1: use ContainsKey and access the key again for its value. var s1 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { if (test.ContainsKey("key")) { sum += test["key"]; } } s1.Stop(); // Version 2: use TryGetValue and use the key already accessed. var s2 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { if (test.TryGetValue("key", out int result)) { sum += result; } } s2.Stop(); Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); } } Output 38.11 ns ContainsKey, indexer 21.16 ns TryGetValue

A summary. We can rewrite Dictionary code to use TryGetValue instead of ContainsKey. It is good to avoid the increment or decrement operators here. Instead store the value with TryGetValue.


© 2007-2020 sam allen. send bug reports to info@dotnetperls.com.