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.