◆ Select の結果を Concat するとコレクションとみなされずに ToString したような結果になる

.NET Framework 3.5 で作られたものを修正する機会がありました
未だにサポートされてるのですね 3.5 ……

プログラムとか始める前に PC でよく目にしてたバージョンだなー となんとなく懐かしく思えます
ただ 3.5 向けなんてたぶん作ったことないので 大きく違う部分があるならけっこう大変そうです

そう思いながら使ってみると あまり大差はないようです
コンパイルする言語な分 Framework 側が対応してなくてもコンパイル時にどうにかできる機能は対応されるようです
dynamic とか async/await みたいな部分だけは Framework のバージョンが古いと対応できないようです


なのであまり 3.5 ということを意識せず使っていたのですが わかりづらい問題にぶつかりました

var keyvalues = new[]
{
new { key = "a", value = "b"},
new { key = "c", value = "d"},
};

Console.WriteLine(string.Concat(keyvalues.Select(e => $"{e.key}/{e.value}\n")));

こんなコード
「key/value」 形式にして Concat するので

a/b
c/d

が出力されると思っていました

だけど結果は

System.Linq.Enumerable+WhereSelectListIterator`2[<>f__AnonymousType0`2[System.String,System.String],System.String]

なんだろうこれ

Select の結果をコレクションとみなして Concat するのじゃなくて よくわからないオブジェクトだから toString しました みたいな結果です
とりあえずリストにすればいっか と思って Select の結果そのままじゃなく .ToList() をして変換したものを Concat に渡すようにしました

結果は

System.Collections.Generic.List`1[System.String]

なんで!
List もだめっぽいです

となると 配列? ということで .ToArray() をすると
a/b
c/d

なんとか求めてる変換ができました

3.5 だとこうなりますが 4.6 とか 4.7 など新しいのだと Select をそのまま Concat に入れて大丈夫です