2011-11-03 7 views
19

Làm cách nào để chuyển đổi từ điển các cặp khóa giá trị thành một chuỗi? Bạn có thể làm điều này bằng cách sử dụng LINQ aggregates? Tôi đã nhìn thấy các ví dụ về việc này bằng cách sử dụng một danh sách các chuỗi, nhưng không phải là một từ điển.Cách tốt nhất để chuyển đổi từ điển <string, string> thành biểu diễn chuỗi tổng hợp duy nhất?

Input:

Dictionary<string, string> map = new Dictionary<string, string> { 
      {"A", "Alpha"}, 
      {"B", "Beta"}, 
      {"G", "Gamma"} 
}; 

Output:

string result = "A:Alpha, B:Beta, G:Gamma"; 

Trả lời

42

Đây là cách ngắn gọn nhất mà tôi có thể nghĩ đến:

var result = string.Join(", ", map.Select(m => m.Key + ":" + m.Value).ToArray()); 

Tuy nhiên, tùy thuộc vào hoàn cảnh của bạn , điều này có thể nhanh hơn (mặc dù không phải là rất thanh lịch):

var result = map.Aggregate(new StringBuilder(), 
    (a, b) => a.Append(", ").Append(b.Key).Append(":").Append(b.Value), 
    (a) => a.Remove(0, 2).ToString()); 

Tôi đã chạy từng bước ở trên với số lần lặp lại khác nhau (10.000; 1.000.000; 10.000.000) trên từ điển ba mục của bạn và trên máy tính xách tay của tôi, sau này là trung bình 39% nhanh hơn. Trên một từ điển với 10 yếu tố, sau này chỉ nhanh hơn khoảng 22%. Một điều khác cần lưu ý, nối chuỗi đơn giản trong ví dụ đầu tiên của tôi nhanh hơn khoảng 38% so với biến thể string.Format() trong mccow002's answer, vì tôi nghi ngờ nó đang ném vào một chuỗi nhỏ ở vị trí nối, với hiệu suất gần như giống hệt nhau số liệu.

Để tái tạo lại từ điển gốc từ chuỗi kết quả, bạn có thể làm một cái gì đó như thế này:

var map = result.Split(',') 
    .Select(p => p.Trim().Split(':')) 
    .ToDictionary(p => p[0], p => p[1]); 
+0

Didn ' t thấy của bạn trước khi tôi đăng của tôi. 1 cho suy nghĩ tuyệt vời :) – mccow002

+1

@CoryLarson Ah, tuyệt. Nhận xét: đã rút lại. – dlev

+0

làm cách nào tôi có thể quay lại từ kết quả var này sang từ điển gốc? – zipi

8
string result = string.Join(", ", map.Select(x => string.Format("{0}:{1}", x.Key, x.Value)).ToArray()) 
3

này sử dụng LINQ Aggregate method:

map 
.Select(m => $"{m.Key}:{m.Value}") 
.Aggregate((m1, m2) => $"{m1}, {m2}"); 

Cùng nhưng với string.Format():

map 
.Select(m => string.Format("{0}:{1}", m.Key, m.Value)) 
.Aggregate((m1, m2) => string.Format("{0}, {1}", m1, m2))