我正在尝试从列表中获取一些值。但我想确保,如果键不存在,它将返回默认值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<T>.GetValueOrDefaultnull-coalescing之类的东西而又不会污染太多代码?

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


我知道Dictionary<TKey, TValue>.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);
    }
}


然后,您可以像这样使用它:

var vmBusinessDays = new BusinessDay()
{
    Jan = businessDays.GetValueOrDefault(1),
    Feb = businessDays.GetValueOrDefault(2)
}

10-01 08:15