Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GetValueOrDefault或Dictionary或List的null合并_C#_.net_List_Dictionary_Trygetvalue - Fatal编程技术网

C# GetValueOrDefault或Dictionary或List的null合并

C# GetValueOrDefault或Dictionary或List的null合并,c#,.net,list,dictionary,trygetvalue,C#,.net,List,Dictionary,Trygetvalue,我试图从列表中获取一些值。但我想确保,若键不存在,它将返回一个默认值0,而不是抛出异常 var businessDays = days.Where(x => x.Year == year).ToDictionary(x => x.Month, x => x.Qty); var vmBusinessDays = new BusinessDay() { Jan = businessDays[1], Feb = businessDays[2], Mar =

我试图从列表中获取一些值。但我想确保,若键不存在,它将返回一个默认值
0
,而不是抛出异常

var businessDays = days.Where(x => x.Year == year).ToDictionary(x => x.Month, x => x.Qty);

var vmBusinessDays = new BusinessDay()
{
    Jan = businessDays[1],
    Feb = businessDays[2],
    Mar = businessDays[3],
    Apr = businessDays[4],
    May = businessDays[5]
    [..]
};
如何使用
Nullable.GetValueOrDefault
null合并
之类的东西而不污染太多的代码

var vmBusinessDays = new BusinessDay()
{
    Jan = businessDays[1].GetValueOrDefault(),
    Feb = businessDays[1]?? 0
}

我知道Dictionary.TryGetValue,但它会复制代码行来设置每个属性的输出值。

您可以定义自己的扩展方法:

public static class DictionaryExtensions
{
    public static TValue GetValueOrDefault<TKey, TValue>(
        this IDictionary<TKey, TValue> dict, TKey key)
    {
        TValue val;
        if (dict.TryGetValue(key, out val))
            return val;
        return default(TValue);
    }
}

dict.TryGetValue(键,输出值);返回val应该足够了
TryGetValue
返回false时指定为将
val
设置为
default(TValue)
。谢谢!正是我所需要的,优雅的代码,使代码保持简单。@hvd:对于这种特殊情况,你是对的。但是,在
booltry…(x,out y)
方法后面有一个隐式模式,其中如果方法返回
false
,则应丢弃
out
值,因为它可能未定义(如的情况)。在我看来,当前版本的代码更清晰、更安全。@Douglas这是一个公平的观点,但在我的经验中,
char.TryParse
是一个例外,标准是总是定义输出值,即使方法返回
false
@hvd:是的。我一直认为未定义的值更常见,但我找不到任何其他示例。所谓“更安全”,我的意思是,如果有人实现了
IDictionary
,从而(错误地)为缺少的键返回非默认值,那么它就不太可能崩溃。空合并运算符版本根本不起作用,因为将捕获
KeyNotFound
异常。由于同样的原因,您的另一个版本也存在缺陷,并且存在一个明显的问题,即对字典的值类型而不是字典本身调用
GetValueOrDefault
。这就是为什么
TryGetValue
存在的原因…正如我在问题中所述。。。我希望这是一个我没有意识到的简单解决方法,我没有意识到的是将它包装成一个扩展。
var vmBusinessDays = new BusinessDay()
{
    Jan = businessDays.GetValueOrDefault(1),
    Feb = businessDays.GetValueOrDefault(2)
}