いくつかの特定のシナリオでは、辞書にそのようなキーがない場合に、キーで辞書の値にアクセスしている間null
ではなく、短くて読みやすい方法を使用することが便利であるように見えました。KeyNotFoundException
私が最初に頭に浮かんだのは、拡張メソッドでした。
public static U GetValueByKeyOrNull<T, U>(this Dictionary<T, U> dict, T key)
where U : class //it's 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
もう1つの回避策は、現在のコンテキストで次のようにを定義することです。
Func<string, string> GetDictValueByKeyOrNull = (key) =>
{
if (dict.ContainsKey(key))
return dict[key];
else
return null;
};
のように利用できますGetDictValueByKeyOrNull("key1")
。
お願いします、私にもっと良い提案をするか、より良いものを選ぶのを手伝ってくれませんか?