web-dev-qa-db-ja.com

Dictionary <string、string>を単一の集約文字列表現に変換する最良の方法は?

キーと値のペアの辞書を単一の文字列に変換するにはどうすればよいですか? LINQアグリゲートを使用してこれを行うことができますか?文字列のリストを使用してこれを行う例を見てきましたが、辞書は使用していません。

入力:

Dictionary<string, string> map = new Dictionary<string, string> { 
          {"A", "Alpha"},  
          {"B", "Beta"}, 
          {"G", "Gamma"}
};

出力:

  string result = "A:Alpha, B:Beta, G:Gamma";
19

これは私が考えることができる最も簡潔な方法です:

_var result = string.Join(", ", map.Select(m => m.Key + ":" + m.Value).ToArray());
_

.NET 4以降を使用している場合は、.ToArray()を削除できます。

_var result = string.Join(", ", map.Select(m => m.Key + ":" + m.Value));
_

また、新しい文字列補間言語機能を使用できる場合:

_var result = string.Join(", ", map.Select(m => $"{m.Key}:{m.Value}"));
_

ただし、状況によっては、これが高速になる場合があります(ただし、あまりエレガントではありません)。

_var result = map.Aggregate(new StringBuilder(),
    (a, b) => a.Append(", ").Append(b.Key).Append(":").Append(b.Value),
    (a) => a.Remove(0, 2).ToString());
_

私は上記のそれぞれを、3項目の辞書と私のラップトップでさまざまな反復回数(10,000; 1,000,000; 10,000,000)で実行しましたが、後者の方が平均39%高速でした。 10個の要素を持つ辞書では、後者の方が約22%高速でした。

もう1つ注意すべき点は、最初の例の単純な文字列連結は、 mccow002の回答string.Format()バリエーションよりも約38%高速でした。これは、ほぼ同一のパフォーマンスメトリックを前提として、連結の場所。

結果の文字列から元の辞書を再作成するには、次のようにします。

_var map = result.Split(',')
    .Select(p => p.Trim().Split(':'))
    .ToDictionary(p => p[0], p => p[1]);
_
46
Cᴏʀʏ
string result = string.Join(", ", map.Select(x => string.Format("{0}:{1}", x.Key, x.Value)).ToArray())
8
mccow002

これは LINQ Aggregate method を使用します:

_map
.Select(m => $"{m.Key}:{m.Value}")
.Aggregate((m1, m2) => $"{m1}, {m2}");
_

同じですが、string.Format()

_map
.Select(m => string.Format("{0}:{1}", m.Key, m.Value))
.Aggregate((m1, m2) => string.Format("{0}, {1}", m1, m2))
_
3
Ray Vega