แปลงพจนานุกรม <string, string> เป็นสตริงที่คั่นด้วยอัฒภาคใน c #


138

ง่ายๆในการเริ่มต้นวันใหม่โดยมีDictionary<string, string>ดังนี้:

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

ฉันต้องการสร้างสตริง: "A=1;B=2;C=3;D=4"

ตัวอย่างการใช้งาน:

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

โปรดทราบว่าพจนานุกรมมีแนวโน้มที่จะมีน้อยกว่า 10 รายการซึ่งชี้ให้เห็นว่า StringBuilder มีการใช้งานมากเกินไป

การใช้งานทางเลือกใดที่กระชับ / มีประสิทธิภาพมากกว่ากัน? เฟรมเวิร์กมีคุณสมบัติที่จะช่วยได้หรือไม่?

คำตอบ:


294
using System.Linq;

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

(และหากคุณใช้. NET 4 หรือใหม่กว่าคุณสามารถละเว้นการToArrayโทรสุดท้ายได้)


ดี :-) อย่างไรก็ตามฉันใช้ String.Format ("{0} = {1}", x.Key, x.Value) แทนตัวดำเนินการ +
Amittai Shapira

แก้ไขตามความคิดเห็น.
the_drow

7
@Amittai, @the_drow: คุณอาจชอบstring.Format; ฉันชอบk+"="+vการเรียงต่อกันง่ายๆแบบนี้ ฉันเดาว่าแต่ละคนเป็นของตัวเอง ...
ลูกา

2
โปรดทราบว่าToArray()ไม่จำเป็นต้องโทรหา การลบผลในการเรียกร้องให้แทนString.Join<String>(String, IEnumerable<String>) String.Join(String, String[])
Dan Stevens

8
string.Join(", ", myDict)หากคุณไม่สนใจเกี่ยวกับรูปแบบการออกที่แน่นอนที่คุณสามารถทำได้ มันจะออกในรูปแบบ[A, 1], [B, 2], [C, 3], [D, 4]
altumano

39

อีกทางเลือกหนึ่งคือใช้ส่วนขยาย Aggregate แทน Join:

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

สไตล์ linq ที่สมบูรณ์แบบ!
menkow

2

เพื่อให้ Linq ทำงานได้Dictionaryคุณต้องมีอย่างน้อย. Net v3.5และusing System.Linq;.

ทางเลือกบางอย่าง:

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

หรือ

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

หากคุณไม่สามารถใช้ Linq ได้ด้วยเหตุผลบางประการให้ใช้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

นี่คือคำตอบเดียวกับที่ @LukeH กล่าวไว้ข้างต้น
Rick Glos

เพื่อนมันไม่เหมือนกันไม่จำเป็นต้องใช้ ToArray () โปรดอย่าลงคะแนนคำตอบของฉัน
Jaydeep Shil

2
มันก็เหมือนกัน - เขากล่าวถึงการลบออกToArray()เมื่อใช้เฟรมเวิร์กเวอร์ชันที่สูงขึ้น
Rick Glos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.