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.