通常、テンプレート ファイルと実行するテキスト置換がある場合Dictionary<string,string>
、次のようなを作成します。
Dictionary<string,string> substitutions = new Dictionary<string, string>
{
{"{firstname}", customer.FirstName },
{"{lastname}", customer.LastName },
{"{address}", "your address" },
{"{siteurl}", _siteUrl },
};
if (customer.Address != null)
{
substitutions["{address}"] = customer.GetAddress();
}
等々。次に、次のようなことができます。
email.Body = substitutions.Aggregate(template,
(current, sub) => current.Replace(sub.Key, sub.Value));
置換されたテンプレートを取得します。
今日、置換が特定の順序で実行されるようにする必要がある状況がありました。
これで、それらが正しい順序でに配置されていることを確認し、Dictionary
それらが列挙される任意の順序がその順序を維持することを期待できます — aDictionary
が他の順序で列挙されるのを見たことはありませんが、 an の順序はそうでICollection
はありません保証します。
したがって、次のようなことを行うと便利だと思いました(i++
「任意の値」のプレースホルダーとして使用されている場所:
SomeCollection<string,string,int> substitutions
= new SomeCollection<string, string, int>
{
{"{firstname}", customer.FirstName, i++ },
{"{lastname}", customer.LastName, i++ },
{"{address}", "your address", i++ },
{"{siteurl}", _siteUrl, Int32.MaxValue }, // this should happen last
};
if (customer.Address != null)
{
substitutions["{address}"] = customer.GetAddress();
}
IComparer
そして、値を並べ替えるために何らかの種類の をプッシュすることができましたint
。
しかし、その後、そのようなコレクションを作成する方法を考え出そうとしましたDictionary<string, Tuple<int, string>>
が、. on) を呼び出し.Replace("{siteurl}", _siteUrl)
の最後に追加するだけで、Aggregate
適切に機能します。
でも、エレガントにできたかもしれないものをあきらめてしまったのは、私を悩ませています。私が遭遇していた問題は(締め切りについてストレスを感じないようにしながら、 a を実装してメソッドを実装する方法を考え出すことを除いてDictionary<string, Tuple<int, string>>
)、次のものが欲しいということでした:ICollection<KeyValuePair<string,string>>
GetEnumerator
- 上記のオブジェクト初期化構文を使用して簡単に宣言する機能。
- キーでメンバーを取得および設定する機能 (したがって、 でバッキング
Dictionary<string, Tuple<int, string>>
)。 foreach
の順番でループを引き出す機能int
。int
アイテムのソート位置を気にしない場合、指定せずにアイテムを追加 (または初期化) する機能。- 上記の呼び出しのように、比較的簡潔なものを使用して置換を実行する機能
Aggregate
(おそらくIComparer
、書き込みまでは取得できませんでした)。
私が行き詰まっていたのは、実装と、インデクサーのオーバーロードが難しくないことGetEnumerator
を忘れていたことです。
そのような要件をどのように実装しますか。私は正しい軌道に乗っていたのでしょうか、それとももっとエレガントなものを見落としていましたか? a に固執して、Dictionary<string,string>
新しいアイテムを最初または最後に挿入する方法を考え出す必要がありますか?
私が完全に理解できなかった美しくエレガントなソリューションは何ですか? その必要をどのように満たしたでしょうか。