要素対を区切るときに
要素対を含まないか、1つだけ含むときには、カンマ「,」で区切る必要はありません。そのため、foreach ループでは、少し工夫が必要です。すると、次のような構造が見えてきます。
bool first = true;
foreach (...) {
if (first) first = false;
else buf.Append(", ");
...
}
変数 first の初期値は true です。すると、foreach ループでは(最初の要素だけ)if に続く条件式 (first) が成立して、変数 first の値は false になります。そして(次の要素から)この条件式は成立しないので、カンマ「,」で区切ります。つまり、第2要素以降はつねに、各要素対をカンマ「,」で区切ります。
None がキーのときに
キー要素が None のときには、特別な配慮が必要です。
if (kv.Key == nullObject)
buf.Append("None");
else
buf.Append(Ops.StringRepr(kv.Key));
キー要素が None のときには、そのリテラル表現として "None" を追加します。それ以外なら、作業領域 buf の末尾には、任意のオブジェクト kv.Key を表現する文字列を追加します。
ここでは、どのようにして文字列表現が得られるか(how)は知らなくても、それを使ってなにをしたいか(what)を理解できれば、十分です。実引数に指定した任意のオブジェクトの文字列表現が欲しいときに、Ops.StringRepr を利用するだけです。
要素対を含まないときに
要素対を含まないときには、括弧 {} で括るだけです。
buf.Append("{");
...
foreach (KeyValuePair
対象となる IDictionary self が、要素対を含まないときには、foreach ループの本体を実行しません。そのため、作業領域 buf には、括弧 "{}" だけを追加します。