.net 如何使用带有默认值TyrGet模式在一行中完成所有操作

xriantvc  于 2022-12-20  发布在  .NET
关注(0)|答案(2)|浏览(140)

假设我们有以下代码,这是实现此目的的最标准代码:

// 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

那么这是一种在一条线上完成所有事情方法吗?

3ks5zfa0

3ks5zfa01#

可以将value变量声明为三元表达式的结果:

string value = kvp.TryGetValue("MyKey", out value) ? value :  "default";

其他可能性:
您可以使用以下语法

if(!kvp.TryGetValue("MyKey", out string value)) value = "default" ;

TryGetValue的结果为false时,指定默认值。
如果可用(在.net Core 2及更高版本中),您还可以使用GetValueOrDefault扩展方法:

string value = kvp.GetValueOrDefault("MyKey", "default");

或者自己编写扩展方法:

public static class CollectionExtensions
{
    public static T2 GetValueOrDefault<T1, T2>(IDictionary<T1, T2> dict, T1 key, T2 defaultValue)
    {
        if (!dict.TryGetValue(key, out T2 value)) value = defaultValue;
        return value;
    }
}
w6lpcovy

w6lpcovy2#

你可以写你自己的扩展来获得默认值。不知道为什么kvp,如果你可以使用字典...

public static bool TryGetValueOrDefault(this IDictionary<string, string> d, string key, string def, out string v)
{
    if (d.ContainsKey(key))
    {    
        v = d[key];
        return true;
    }

    v = def;
    return false;
}

. . . . . 
if (myDict.TryGetValueOrDefault("key", "someDefVal", out string retVal))
{
     // do something for found value
}
else
{
    // do something when value is not found
}

DoSomethingWithYourValue(retVal);

或者干脆忘掉Try部分,

public static string GetDictValueOrDefault(this IDictionary<string, string> d, string key, string def).....

var ret = GetDictValueOrDefault("key", "someDefVal")
DoSomethingWithYourValue(ret);

相关问题