В каком-то определенном сценарии мне показалось полезным иметь короткий, читаемый способ получить null
вместо KeyNotFoundException
при доступе к значению словаря по ключу, когда в словаре нет такого ключа.
Первое, что мне пришло в голову, это метод расширения:
public static U GetValueByKeyOrNull<T, U>(this Dictionary<T, U> dict, T key)
where U : class //it acceptable for me to have this constraint
{
if (dict.ContainsKey(key))
return dict[key];
else
//it could be default(U) to use without U class constraint
//however, I didn't need this.
return null;
}
Но это не очень коротко сказано на самом деле, когда вы пишете что-то вроде этого:
string.Format("{0}:{1};{2}:{3}",
dict.GetValueByKeyOrNull("key1"),
dict.GetValueByKeyOrNull("key2"),
dict.GetValueByKeyOrNull("key3"),
dict.GetValueByKeyOrNull("key4"));
Я бы сказал, что было бы намного лучше, чем синтаксис базового синтаксиса: dict["key4"]
.
Затем я придумал идею иметь класс с полем словаря private
, который раскрывает нужные мне функции:
public class MyDictionary<T, U> //here I may add any of interfaces, implemented
//by dictionary itself to get an opportunity to,
//say, use foreach, etc. and implement them
// using the dictionary field.
where U : class
{
private Dictionary<T, U> dict;
public MyDictionary()
{
dict = new Dictionary<T, U>();
}
public U this[T key]
{
get
{
if (dict.ContainsKey(key))
return dict[key];
else
return null;
}
set
{
dict[key] = value;
}
}
}
Но, кажется, немного накладные расходы, чтобы получить небольшое изменение в основном поведении.
Еще одним обходным решением может быть определение Func
в текущем контексте следующим образом:
Func<string, string> GetDictValueByKeyOrNull = (key) =>
{
if (dict.ContainsKey(key))
return dict[key];
else
return null;
};
поэтому его можно использовать как GetDictValueByKeyOrNull("key1")
.
Не могли бы вы дать мне больше предложений или помочь выбрать лучший?