Domanda

Sto cercando di ottenere alcuni valori da un elenco.Ma voglio assicurare che se la chiave non esiste, restituirà un valore predefinito 0 invece di lanciare eccezione.

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]
    [..]
};
.

Come è possibile utilizzare qualcosa come Nullable<T>.GetValueOrDefault o null-coalescing senza inquinare troppo il codice?

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

Sono a conoscenza di Dictionary<TKey, TValue>.TryGetValue, ma duplificherà le linee di codice duplicate per impostare il valore di uscita a ciascuna proprietà.

È stato utile?

Soluzione

È possibile definire il proprio metodo di estensione:

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

Potresti quindi usarlo come:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top