Ubah Kamus <string, string> menjadi string yang dipisahkan titik koma di c #


138

Sederhana untuk memulai hari, diberikan Dictionary<string, string>sebagai berikut:

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

Saya ingin membuat string: "A=1;B=2;C=3;D=4"

Contoh implementasi:

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();

Perhatikan bahwa kamus kemungkinan memiliki kurang dari 10 item yang menunjukkan bahwa StringBuilder berlebihan.

Implementasi alternatif apa yang lebih ringkas / efisien? Apakah kerangka kerja memiliki fitur yang akan membantu?

Jawaban:


294
using System.Linq;

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

(Dan jika Anda menggunakan .NET 4, atau yang lebih baru, Anda dapat mengabaikan ToArraypanggilan terakhir .)


Bagus :-) Namun, saya akan menggunakan String.Format ("{0} = {1}", x.Key, x.Value) sebagai ganti operator +
Amittai Shapira

Diedit menurut komentar.
the_drow

7
@Amittai, @the_drow: Anda mungkin lebih suka string.Format; Saya lebih suka k+"="+vpenggabungan sederhana seperti ini. Masing-masing untuk mereka sendiri kurasa ...
LukeH

2
Perhatikan bahwa panggilan ke ToArray()tidak diperlukan. Menghapusnya menghasilkan panggilan ke String.Join<String>(String, IEnumerable<String>)alih-alih String.Join(String, String[]).
Dan Stevens

8
Jika Anda tidak peduli dengan format keluaran yang tepat, Anda bisa melakukannya string.Join(", ", myDict). Ini akan menampilkan dalam bentuk[A, 1], [B, 2], [C, 3], [D, 4]
altumano

39

Opsi lainnya adalah menggunakan ekstensi Agregat daripada Gabung:

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

gaya linq yang sempurna!
menkow

2

Agar Linq dapat bekerja, DictionaryAnda membutuhkan setidaknya .Net v3.5 dan using System.Linq;.

Beberapa alternatif:

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

atau

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

Jika Anda tidak dapat menggunakan Linq karena alasan tertentu, gunakan 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

Ini adalah jawaban yang sama yang dimiliki @LukeH di atas.
Rick Glos

Bung itu tidak sama, tidak perlu menggunakan ToArray (). Tolong jangan meremehkan jawaban saya.
Jaydeep Shil

2
Itu sama - dia menyebutkan penghapusan ToArray()saat menggunakan versi kerangka kerja yang lebih tinggi.
Rick Glos
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.