C#操作字典键如何避免抛出System.Collections.Generic.KeyNotFoundException异常
可行的简洁实现方案
方案1:使用TryGetValue(兼容所有.NET版本)
TryGetValue本身可以一次完成「键存在性判断+值获取」,结合out变量的简写可以实现单语句操作,性能比ContainsKey+索引查询的写法更高(只查1次字典):
if (results.TryGetValue("a", out var val)) someOperation(val); if (results.TryGetValue("b", out var valB)) { /* 自定义操作 */ } if (results.TryGetValue("d", out var valD)) someOperation(valD);
方案2:使用GetValueOrDefault + 空条件运算符(.NET Core 2.0+ / .NET 5+ 支持)
完全符合你想要的类似?.的调用效果,写法最简短:
// 键不存在时GetValueOrDefault返回对应类型默认值,string类型默认值为null,空条件运算符会直接中断后续调用 results.GetValueOrDefault("a")?.someOperation(); results.GetValueOrDefault("d")?.someOperation();
注意:如果字典的值类型是值类型(struct),需要先转成对应的可空类型再使用空条件运算符,比如
results.GetValueOrDefault("count")?.ToString()。
方案3:自定义扩展方法封装(复用性最强)
如果这类操作出现频率很高,可以封装通用扩展方法,后续调用代码可以做到极简:
首先定义扩展类:
public static class DictionaryExtensions { public static void IfPresent<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key, Action<TValue> operate) where TKey : notnull { if (dict.TryGetValue(key, out var value)) operate(value); } }
之后的调用代码:
results.IfPresent("a", someOperation); results.IfPresent("b", val => { // 任意自定义操作 Console.WriteLine($"当前b的值是{val}"); }); results.IfPresent("c", val => OtherMethod(val, "其他入参"));
内容的提问来源于stack exchange,提问作者SolarOsQuiere
相关产品推荐
相关产品推荐

