2

リストからいくつかの値を取得しようとしています。ただし、キーが存在しない場合は、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>.GetValueOrDefaultまたはそのようなものを使用するにはどうすればよいでしょうか?null-coalescing

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

は承知してDictionary<TKey, TValue>.TryGetValueいますが、各プロパティに出力値を設定するためのコード行が重複します。

4

2 に答える 2

3

独自の拡張メソッドを定義できます。

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)
}
于 2014-02-25T19:18:43.143 に答える