如何用一行代码结合TryGetValue模式与默认值为变量赋值?
问题描述
我想要用一行代码实现以下逻辑的等价效果(原本的标准实现):
// 遍历Dictionary中的键值对 string value; if (!kvp.TryGetValue("MyKey", out value)) value= "default";
要求如下:
- 不想新增
newValue这类额外变量(比如下面这种写法不符合需求):
string newValue = kvp.TryGetValue("MyKey", out string value) ? value : "default"; // 当未找到键时`value`为null,`newValue`为"default"可直接使用 // 但我不想新增`newValue`变量,希望将默认值直接赋值给`value`
- 不想用技术上属于两条语句的
if写法:
if(!kvp.TryGetValue("MyKey", out string value)) value = "default" ; // 这在技术上属于两条语句
- 现有变通写法但可读性差:
string value = kvp.TryGetValue("MyKey", out value) ? value : "default"; // 编译器会将上述语句转换为: string value; if (!kvp.TryGetValue("MyKey", out value)) value= "default";
这种写法初看会疑惑为什么要把value赋值给自己,可读性不佳。
- 不想自己写包装函数,也知道
GetValueOrDefault方法(比如kvp.GetValueOrDefault("MyKey", "default")),但真正想实现的是类似以下示意代码的效果(但该代码无法编译):
kvp.TryGetValue("MyKey", out string value) ? value : value = "default"; // 代码无法编译,仅作示意
请问是否存在一行代码实现该需求的方法?
可行方案
有几种符合要求的一行代码实现方式:
- 利用逻辑或短路特性(适用于C# 7.0及以上)
通过||的短路逻辑,在TryGetValue失败时直接给value赋值默认值,用_接收无用的布尔返回值即可:
_ = kvp.TryGetValue("MyKey", out string value) || (value = "default") != null;
原理:如果TryGetValue返回true,后面的赋值语句不会执行;如果返回false,则执行value = "default",!= null是为了让整个表达式符合布尔类型要求。
- 用临时变量优化可读性
避免自赋值的困惑,用临时变量承接TryGetValue的输出,再通过三元表达式完成赋值:
string value = kvp.TryGetValue("MyKey", out var temp) ? temp : "default";
- 优先使用
GetValueOrDefault(场景允许时)
如果你的字典是Dictionary<TKey, TValue>,这个方法本身就是最简洁的实现,完全等价于目标逻辑且可读性最高:
string value = kvp.GetValueOrDefault("MyKey", "default");
内容的提问来源于stack exchange,提问作者user16077302
相关产品推荐
相关产品推荐

