"GetOrCreate"-は熟しているでしょうか。
-
13-09-2019 - |
質問
Ok、この共通の慣用法は、指定されるものを多用した時間(い):
class FooBarDictionary
{
private Dictionary<String, FooBar> fooBars;
...
FooBar GetOrCreate(String key)
{
FooBar fooBar;
if (!fooBars.TryGetValue(key, out fooBar))
{
fooBar = new FooBar();
fooBars.Add(key, fooBar);
}
return fooBar;
}
}
ないようなのでしょうか。
ありクライアントまで、フルのC#でも"簡単に"転C++.そのためこのタグです。)
解決
他のヒント
私はいつもこのような関数のobtainSomething()
を呼び出します。
あなたはそれをやっている理由は、
これは一種の依存 - イディオムは、私が最初に使用する上で作成し、オンデマンドでメモ化、キャッシング、初期化と呼ばれることが見てきたものです。通常、私は、メソッド「ensureFoo」と呼ぶのではなく、「GetOrCreate」
私は、ハイレベルのパターンの全体的なプログラミングの名前がわからないんだけど、Perlはと呼ばれるこの素晴らしい振る舞いを持っていますAutovivification に - 。あなたは、ハッシュ非既存のキーの値を照会しているとき、すなわち、自動的に未定義の値を持つハッシュ(マップ)キーを作成する
クライアントまで、フルのC#...
...私のDefaultingDictionary<>なことがありますか?ボーナスパーツとして
- を指定できますデフォルト値または 工場機能 価値創造がないためにキー:
- で暗黙的に変換IDictionary<>(ラッピングの辞書)
- で拡張方法に姿を変えずに辞書にDefaultingDictionary<>クラ
フルコード:
の拡張 .AsDefaulting
使用できる透過的に使用 IDictionary<>
としてデフォルトからかもしれないけど、僕が選択でき用辞書についても例から得られた第三者のAPIとしてデフォルトが発生し、基になるコンテナまで更新されず自vivifiedいる。
利用しています
IDictionary<string, MyItem> dict = LoadFromDatabase();
// using a fixed value
SomeFunc(dict.AsDefaulting(defaultItem));
// using an independent generator function
var defaulting = dict.AsDefaulting(() => new MyItem { Id = System.Guid.NewGuid() });
// using a keydepedent generator function
var defaulting = dict.AsDefaulting(key => LazyLoadFromDatabase(key));
テストケース
を含む:
所属していません StackOverflow