要素対を区切るときに

要素対を含まないか、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 を利用するだけです。

キーと値を区切るときに

要素対は、キーと値をコロン「:」で区切ります。

    foreach (KeyValuePair kv in self) {
...
buf.Append(": ");
buf.Append(Ops.StringRepr(kv.Value));
}

作業領域 buf の末尾には、キー要素に続けて、コロン「:」を追加します。そして、値要素として、任意のオブジェクト kv.Value を表現する文字列を追加します。


Previous〈3/3〉Next

イディオム:foreach 文

メソッドの本体には、次に示す C# のイディオムが記述してあります。

    foreach (KeyValuePair<...> kv in self) {
... kv.Key ...
... kv.Value ...
}

foreach ループでは、IDictionary self を構成する各要素 KeyValuePair kv を順に参照します。そして、プロパティー .Key/.Value を利用して、キー/値を得ているのが分かります。
《参照》ジェネリック構造体 KeyValuePair:詳細は C# idioms を参照してください。

要素対を含まないときに

要素対を含まないときには、括弧 {} で括るだけです。

    buf.Append("{");
...
foreach (KeyValuePair kv in self) {
...
}
buf.Append("}");

対象となる IDictionary self が、要素対を含まないときには、foreach ループの本体を実行しません。そのため、作業領域 buf には、括弧 "{}" だけを追加します。