Chuyển đổi từ điển <chuỗi, chuỗi> thành chuỗi phân tách bằng dấu chấm phẩy trong c #


135

Đơn giản để bắt đầu một ngày, được đưa ra Dictionary<string, string>như sau:

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

Tôi muốn tạo một chuỗi: "A=1;B=2;C=3;D=4"

Một ví dụ thực hiện:

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

Lưu ý rằng từ điển có thể có ít hơn 10 mục cho thấy StringBuilder là quá mức cần thiết.

Những triển khai thay thế nào ngắn gọn / hiệu quả hơn? Liệu khuôn khổ có bất kỳ tính năng sẽ giúp?

Câu trả lời:


290
using System.Linq;

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

(Và nếu bạn đang sử dụng .NET 4 hoặc mới hơn, thì bạn có thể bỏ qua ToArraycuộc gọi cuối cùng .)


Nice :-) Tuy nhiên, tôi sẽ sử dụng String.Format ("{0} = {1}", x.Key, x.Value) thay vì toán tử +
Amittai Shapira

7
@Amittai, @the_drow: Bạn có thể thích string.Format; Tôi thích k+"="+vcách ghép đơn giản như thế này. Tôi đoán mỗi người theo cách riêng của họ ...
LukeH

2
Lưu ý rằng cuộc gọi đến ToArray()là không cần thiết. Loại bỏ nó dẫn đến một cuộc gọi đến String.Join<String>(String, IEnumerable<String>)thay vì String.Join(String, String[]).
Dan Stevens

8
Nếu bạn không quan tâm đến định dạng đầu ra chính xác, bạn có thể làm string.Join(", ", myDict). Nó sẽ xuất ra dưới dạng[A, 1], [B, 2], [C, 3], [D, 4]
altumano

2
@SRJ Empty rất khác với Null .... Empty ""hoặc Whitespace " ", là các khóa hợp lệ trong Từ điển. Mặc dù không nên sử dụng một trong hai, chúng là các giá trị hợp lệ. Bạn cần ContainsKeykiểm tra xem bạn có cần Tên khóa cụ thể hoặc cấu trúc ngôn ngữ tương đương foreachđể nắm bắt các giá trị.
GoldBishop

39

Một tùy chọn khác là sử dụng tiện ích mở rộng Tổng hợp thay vì Tham gia:

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

phong cách linq hoàn hảo!
menkow

1

Để Linq hoạt động hơn Dictionarybạn cần ít nhất .Net v3.5using System.Linq;.

Một số lựa chọn thay thế:

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

hoặc là

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

Nếu bạn không thể sử dụng Linq vì một số lý do, hãy sử dụng 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

Đây là câu trả lời tương tự @LukeH có ở trên.
Rick Glos

anh bạn không giống nhau, không cần sử dụng ToArray (). Xin đừng downvote câu trả lời của tôi.
Jaydeep Shil

2
Điều này cũng tương tự - ông đề cập đến việc loại bỏ ToArray()khi sử dụng các phiên bản cao hơn của khung.
Rick Glos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.