GetValueordefault o Null-Coalescing per dispositivi giudiziari o elenco
-
21-12-2019 - |
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à.
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