2011-11-03 20 views
19

Anahtar değer çiftleri sözlüğünü tek bir dizeye nasıl dönüştürürüm? Bunu LINQ kümelerini kullanarak yapabilir misiniz? Bunu bir dizeler listesi kullanarak yapmakla ilgili örnekler gördüm, ancak bir sözlük değil.Sözlük <string, string> 'i tek bir topluluğa dönüştürmenin en iyi yolu String sunumu?

Girdi:

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

Çıktı:

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

cevap

42

Bu benim düşünebildiğim en özlü yoludur: Ancak

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

, senin koşullara bağlı olarak , Bu olabilir Daha hızlı (her ne kadar çok şık değil) olması: 10.000 tekrarlamalar değişen sayıda (yukarıda her ran

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

; 1,000,000; 10.000.000) üç öğeli sözlüğünüzde ve dizüstü bilgisayarımda, bu oran ortalama% 39 daha hızlıydı. 10 elemanlı bir sözlükte, ikincisi sadece% 22 daha hızlıydı.

Ben hemen hemen aynı performansı göz önüne alındığında, birleştirme yerine biraz dize oluşturucu atıyor şüpheli olarak ilk örnekte, basit dize birleştirme Unutulmaması gereken bir diğer şey, mccow002's answer içinde string.Format() varyasyon yaklaşık% 38 daha hızlıydı

ölçütler.

sonuç dizesinden özgün sözlüğü tekrar oluşturmak için böyle bir şey yapabileceğini:

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

Didn ' benimkini göndermeden önce seninkini görüyorum. Parlak düşünme için +1 :) – mccow002

+1

@CoryLarson Ah, havalı. Yorum: geri çekildi. – dlev

+0

Bu varyanttan nasıl orijinal sözlüklere geri dönebilirim? – zipi

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

Bu kullanmaktadır LINQ Aggregate method: Aynı

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

ama string.Format() ile:

map 
.Select(m => string.Format("{0}:{1}", m.Key, m.Value)) 
.Aggregate((m1, m2) => string.Format("{0}, {1}", m1, m2)) 
İlgili konular