官方解释
上面解释:1)TryGetValue是根据key返回相应的数据到value,如果没有key则返回默认值到value;
2)这个方法的返回是bool值,如果dictionary里有存在相应的key为true,没有存在,则为false
例子1
using System; using System.Collections.Generic; namespace TryGetValueExp { class Program { static void Main(string[] args) { var counts = new Dictionary<string, int>(); counts.Add("key", 0); int value;//这个变量用来存储TryGetValue返回的相应key的value. if (counts.TryGetValue("key", out value)) { counts["key"] = value + 1; Console.WriteLine("Value: " + counts["key"]); } } } }
测试结果如下:
例子2
除上面例子1的写法外,也可以通过参数指定“out”类型
//例子二: var ids = new Dictionary<string, bool>() { { "A", true } }; //我们可以通过参数指定“out”类型,如下: if (ids.TryGetValue("A",out bool result)) { Console.WriteLine($"Value:{result}"); }
测试结果如下:
ContainsKey与TryGetValue对比
1)当确定字典中存在该键值对时,可以使用ContainsKey:
2) 当在字典中不能确定是否存在该键时需要使用TryGetValue,以减少一次不必要的查找,同时避免了判断Key值是否存在而引发的“给定关键字不在字典中。”的错误。
3)两者性能对比:
//例子三: const int _max = 10000000; var test = new Dictionary<string, int>(); test["key"] = 1; int sum = 0; //法一:用ContainsKey获取对应key的value值 var s1 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { if (test.ContainsKey("key")) { sum += test["key"]; } } s1.Stop(); //法二:用TryGetValue获取对应key的value值 var s2 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { if (test.TryGetValue("key", out int r)) { sum += r; } } 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"));
测试结果如下:
从上面测试结果看:
TryGetValue取值比用ContainsKey更快。原因是:使用ContainsKey,如果键存在,则会在每次循环中再次取值,但TryGetValue,会直接存储结果值,然后马上用于求和。
参考网址:
https://www.dotnetperls.com/trygetvalue
https://blog.csdn.net/qq_38721111/article/details/83508909
https://blog.csdn.net/joyhen/article/details/9310743
代码存于:..CSharpBasic\TryGetValueExp
标签:TryGetValue,Dictionary,c#,value,int,key,ContainsKey,out From: https://www.cnblogs.com/keeplearningandsharing/p/16619160.html