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)
}