2011-11-03 11 views
19

キー値のペアの辞書を単一の文字列に変換するにはどうすればよいですか? LINQ集約を使用してこれを行うことはできますか?私は文字列のリストを使ってこれを行う例を見てきましたが、辞書は見ていませんでした。Dictionary <string、string>を単一の集約文字列表現に変換する最適な方法は?

入力:

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

出力:あなたの状況に応じて、しかし

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

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

答えて

42

これは、私は考えることができる最も簡潔な方法であります、これは(それほどエレガントではないが)より速い:

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

私は、上記のそれぞれをさまざまな回数の反復回数(10,000; 1,000,000;私のラップトップでは、後者は平均39%速かったです。 10要素の辞書では、後者のほうが約22%高速でした。

私の最初の例での単純な文字列の連結は、のmccow002's answerのバリエーションよりも約38%速かった。これは、連結の代わりに小さな文字列ビルダーを投げていると思われるからだ。メトリック

は、結果の文字列から元の辞書を再作成するには、このような何かを行うことができます:

var map = result.Split(',') 
    .Select(p => p.Trim().Split(':')) 
    .ToDictionary(p => p[0], p => p[1]); 
+0

Didn '私が私の前にあなたのものを見ることはありません。 +1素晴らしい考えのために:) – mccow002

+1

@CoryLarsonああ、クール。コメント:引っ込められました。 – dlev

+0

これらのvar結果から元の辞書に戻すにはどうすればよいですか? – zipi

8
string result = string.Join(", ", map.Select(x => string.Format("{0}:{1}", x.Key, x.Value)).ToArray()) 
3

これは使用しています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)) 
関連する問題