.NET Framework 4.8泛型函数调用时如何添加字典键存在性校验
问题描述
现有如下函数调用:
FunctionName(List, s => new Class(s, Dictionary[s.Key]));
FunctionName的定义如下:
private void FunctionName<T>(List<T> Data, Func<KeyValuePair<string, object>, T> ClassCreator) { foreach (... entry in ...) { Data.Add(ClassCreator(entry)); } return; }
问题在于,FunctionName是泛型函数,无法在其中添加针对KeyNotFoundException的字典键存在性校验(因为它可能处理其他类型变量)。想知道能不能在函数调用环节添加这类校验,实现类似如下逻辑:
如果字典键不存在则用
string.Empty,否则取字典对应的值
解决方案
可以直接在传入的lambda表达式里整合TryGetValue的校验逻辑,不需要嵌套调用FunctionName。正确写法如下:
完整语句块写法
FunctionName(List, s => { object value; // 尝试获取字典值,不存在则赋值string.Empty if (!Dictionary.TryGetValue(s.Key, out value)) { value = string.Empty; } return new Class(s, value); });
简洁三元表达式写法
如果字典值类型与string.Empty兼容,也可以用更紧凑的写法:
FunctionName(List, s => new Class(s, Dictionary.TryGetValue(s.Key, out var value) ? value : string.Empty) );
注意:用TryGetValue做安全取值比捕获KeyNotFoundException性能更优,异常捕获本身存在额外开销,是字典取值的推荐安全写法。
内容的提问来源于stack exchange,提问作者Filipe
相关产品推荐
相关产品推荐

