2010-11-10 36 views
25

Tôi có chuỗi có định dạng "key1 = value1; key2 = value2; key3 = value3;"Chuyển đổi chuỗi bị xóa thành từ điển <string, string> trong C#

Tôi cần phải chuyển đổi nó thành từ điển cho các cặp giá trị khóa được đề cập ở trên.

Cách tốt nhất để thực hiện việc này là gì? Cảm ơn.

+6

này về cơ bản là một bản sao của câu hỏi này: http://stackoverflow.com/questions/776107/best-way-to-convert- query-string-to-dictionary-in-c Tôi cho rằng bạn phải thay thế ';' bằng '&' trước đó sẽ hoạt động. –

Trả lời

5

Bạn có thể viết nó như thế này hoặc lặp lại để tự làm. Dù bằng cách nào. Cuối cùng, bạn đang chia tách trên ; để nhận các cặp mặt hàng, sau đó nhấp vào = để nhận khóa và giá trị.

string input = "key1=value1;key2=value2;key3=value3;"; 
Dictionary<string, string> dictionary = 
    input.TrimEnd(';').Split(';').ToDictionary(item => item.Split('=')[0], item => item.Split('=')[1]); 

phiên bản Loop:

Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
string[] items = input.TrimEnd(';').Split(';'); 
foreach (string item in items) 
{ 
    string[] keyValue = item.Split('='); 
    dictionary.Add(keyValue[0], keyValue[1]); 
} 
64

Something như thế này?

var dict = text.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries) 
       .Select(part => part.Split('=')) 
       .ToDictionary(split => split[0], split => split[1]); 

Tất nhiên, điều này sẽ không thành công nếu giả định không được đáp ứng. Ví dụ: IndexOutOfRangeException có thể bị ném nếu văn bản không ở định dạng đúng và ArgumentException sẽ bị ném nếu có khóa trùng lặp. Mỗi trường hợp này sẽ yêu cầu các sửa đổi khác nhau. Nếu có thể có khoảng trắng thừa, bạn có thể cần một số cuộc gọi string.Trim nếu cần.

+0

+1 cho .ToDictionary - mịn –

11

Cập nhật Ani để tính đến dấu chấm phẩy ở cuối. Mệnh đề where sẽ đảm bảo rằng bạn có khóa và giá trị trước khi tạo và nhập.

var dictionary = "key1=value1;key2=value2;key3=value3;" 
    .Split(';') 
    .Select (part => part.Split('=')) 
    .Where (part => part.Length == 2) 
    .ToDictionary (sp => sp[0], sp => sp[1]); 
8

Kìa trắng tuyệt vời bỏ qua, điều chỉnh cho giá trị cuối cùng có hay không có một sức mạnh dấu chấm phẩy của biểu thức thông thường:

 var dict = Regex.Matches("key1 = value1; key2 = value2 ; key3 = value3", @"\s*(.*?)\s*=\s*(.*?)\s*(;|$)") 
     .OfType<Match>() 
     .ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value); 

Nhưng nghiêm túc mặc dù, Ani xứng đáng đạo cụ cho .ToDictionary(). Tôi sẽ không bao giờ nghĩ về điều đó.

5

Bạn có thể làm điều này bằng chuỗi JSON, ví dụ:

var dic = JsonConvert.DeserializeObject<Dictionary<int, string>>("{'1':'One','2':'Two','3':'Three'}"); 
Các vấn đề liên quan