Sözlük <string, string> c # içindeki noktalı virgülle ayrılmış dizeye dönüştür


135

Güne başlamak için basit bir Dictionary<string, string>, aşağıdaki gibi verilir :

var myDict = new Dictionary<string, string>();
myDict["A"] = "1";
myDict["B"] = "2";
myDict["C"] = "3";
myDict["D"] = "4";

Bir dize oluşturmak istiyorum: "A=1;B=2;C=3;D=4"

Örnek bir uygulama:

var myStringBuilder = new StringBuilder();
bool first = true;
foreach (KeyValuePair<string, string> pair in myDict)
{
    if (first)
    {
        first = false;
    }
    else
    {
        myStringBuilder.Append(";");
    }

    myStringBuilder.AppendFormat("{0}={1}", pair.Key, pair.Value);
}

var myDesiredOutput = myStringBuilder.ToString();

Sözlüğün muhtemelen bir StringBuilder'ın aşırı doldurulduğunu gösteren 10 öğeden daha az öğe içerdiğini unutmayın.

Hangi alternatif uygulamalar daha özlü / etkilidir? Çerçevede yardımcı olacak herhangi bir özellik var mı?

Yanıtlar:


290
using System.Linq;

string s = string.Join(";", myDict.Select(x => x.Key + "=" + x.Value).ToArray());

(Ve .NET 4 veya daha yenisini kullanıyorsanız, son ToArrayaramayı atlayabilirsiniz .)


Güzel :-) Ancak, + operatörü yerine String.Format ("{0} = {1}", x.Key, x.Value)
kullanacağım

7
@Amittai, @the_drow: Tercih edebilirsiniz string.Format; Bunun k+"="+vgibi basit birleştirme tercih ederim . Her biri kendi sanırım ...
LukeH

2
İçin çağrı ToArray()gerekmediğini unutmayın. Kaldırılması String.Join<String>(String, IEnumerable<String>)yerine çağrılmasına neden olur String.Join(String, String[]).
Dan Stevens

8
Kesin çıktı biçimini umursamıyorsanız, bunu yapabilirsiniz string.Join(", ", myDict). Bu form şeklinde [A, 1], [B, 2], [C, 3], [D, 4]
çıkacak

2
@SRJ Empty, Null'dan çok farklıdır. Empty ""veya Whitespace " ", bir Sözlük'teki geçerli anahtarlardır. Her ikisinin de kullanılması önerilmemesine rağmen, bunlar geçerli değerlerdir. Bir yapmanız gereken ContainsKeybelirli bir tuşa Adı veya dil yapısı eşdeğer gerekiyorsa çeki foreachdeğerlerini yakalamak için.
GoldBishop

39

Başka bir seçenek de Join yerine Aggregate uzantısını kullanmaktır:

String s = myDict.Select(x => x.Key + "=" + x.Value).Aggregate((s1, s2) => s1 + ";" + s2);

mükemmel linq tarzı!
menkow

1

Linq'in çalışması Dictionaryiçin en azından .Net v3.5 ve using System.Linq;.

Bazı alternatifler:

string myDesiredOutput = string.Join(";", myDict.Select(x => string.Join("=", x.Key, x.Value)));

veya

string myDesiredOutput = string.Join(";", myDict.Select(x => $"{x.Key}={x.Value}"));

Linq'i herhangi bir nedenle kullanamıyorsanız, şunu kullanın Stringbuilder:

StringBuilder sb = new StringBuilder();
var isFirst = true;
foreach(var x in myDict) 
{
  if (isFirst) 
  {
    sb.Append($"{x.Key}={x.Value}");
    isFirst = false;
  }
  else
    sb.Append($";{x.Key}={x.Value}"); 
}

string myDesiredOutput = sb.ToString(); 

myDesiredOutput:

A=1;B=2;C=3;D=4

-3

Bu, @LukeH'nin yukarıda olduğu aynı cevaptır.
Rick Glos

ahbap aynı değil, ToArray () kullanmaya gerek yok. Lütfen cevabımı küçümsemeyin.
Jaydeep Shil

2
Aynı şey - ToArray()çerçevenin daha yüksek sürümlerini kullanırken kaldırıldığından bahsediyor .
Rick Glos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.