假设我们有以下代码,这是实现此目的的最标准代码:
// iterate each key value pairs in a Dictionary
string value;
if (!kvp.TryGetValue("MyKey", out value))
value= "default";
但我想把所有事情都集中在一条线上,那就是:
string newValue = kvp.TryGetValue("MyKey", out string value) ? value : "default";
// `value` is null if the key is not found, newValue is "default" which I can use
// but I don't want to use a new string variable `newValue`,
// I want "default" to be assigned to `value` variable
我也不想使用任何if
语句,例如:
if(!kvp.TryGetValue("MyKey", out string value)) value = "default" ;
// it is two statement technically
还有另一种解决方法:
string value = kvp.TryGetValue("MyKey", out value) ? value : "default";
// compiler translates the above statement into
string value;
if (!kvp.TryGetValue("MyKey", out value))
value= "default";
但是它不是很可读,如果你只是第一眼看到它而不考虑编译器是如何工作的,你怎么能把value
赋值给value
本身呢
我可以编写一个 Package 函数来将键作为参数,但我觉得必须有另一种方法来实现。
我承认存在类似kvp.GetValueOrDefault("MyKey", "default")
的GetValueOrDefault
,但我真正想做的是
kvp.TryGetValue("MyKey", out string value) ? value : value = "default"; // code doesn't compile, you get the idea which is
那么这是一种在一条线上完成所有事情方法吗?
2条答案
按热度按时间3ks5zfa01#
可以将
value
变量声明为三元表达式的结果:其他可能性:
您可以使用以下语法
当
TryGetValue
的结果为false时,指定默认值。如果可用(在.net Core 2及更高版本中),您还可以使用
GetValueOrDefault
扩展方法:或者自己编写扩展方法:
w6lpcovy2#
你可以写你自己的扩展来获得默认值。不知道为什么
kvp
,如果你可以使用字典...或者干脆忘掉
Try
部分,