2009-12-05 26 views
31

Tôi có chuỗi nàyLàm thế nào để chia chuỗi thành một cuốn từ điển

string sx="(colorIndex=3)(font.family=Helvetica)(font.bold=1)"; 

và đang tách nó với

string [] ss=sx.Split(new char[] { '(', ')' }, 
    StringSplitOptions.RemoveEmptyEntries); 

Thay vì đó, làm thế nào tôi có thể chia kết quả vào một Dictionary<string,string>? Các kết quả từ điển sẽ giống như thế:

Key   Value 
colorIndex 3 
font.family Helvetica 
font.bold 1 

Trả lời

17

Có thể có những cách hiệu quả hơn, nhưng điều này sẽ làm việc:

string sx = "(colorIndex=3)(font.family=Helvicta)(font.bold=1)"; 

var items = sx.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(s => s.Split(new[] { '=' })); 

Dictionary<string, string> dict = new Dictionary<string, string>(); 
foreach (var item in items) 
{ 
    dict.Add(item[0], item[1]); 
} 
53

Nó có thể được thực hiện bằng LINQ ToDictionary() phương pháp phần mở rộng:

string s1 = "(colorIndex=3)(font.family=Helvicta)(font.bold=1)"; 
string[] t = s1.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries); 

Dictionary<string, string> dictionary = 
         t.ToDictionary(s => s.Split('=')[0], s => s.Split('=')[1]); 

EDIT: Cùng một kết quả có thể đạt được mà không chia tách hai lần e:

Dictionary<string, string> dictionary = 
      t.Select(item => item.Split('=')).ToDictionary(s => s[0], s => s[1]); 
+0

Thậm chí không biết rằng chức năng tách có thể lấy mảng chuỗi làm đối số. Khéo léo. –

+4

Có cách nào tránh gọi 's.Split()' hai lần không? –

+13

Chắc chắn, bằng cách gọi t.Select (item => item.Split ('=')). ToDictionary (s => s [0], s => s [1]); Tương tự như câu trả lời @erikkallen & @Luke. – Elisha

9
var dict = (from x in s1.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries) 
      select new { s = x.Split('=') }).ToDictionary(x => x[0], x => x[1]); 
2

Bạn có thể làm điều này với biểu thức thông thường:

string sx = "(colorIndex=3)(font.family=Helvetica)(font.bold=1)"; 

Dictionary<string,string> dic = new Dictionary<string,string>(); 

Regex re = new Regex(@"\(([^=]+)=([^=]+)\)"); 

foreach(Match m in re.Matches(sx)) 
{ 
    dic.Add(m.Groups[1].Value, m.Groups[2].Value); 
} 

// extract values, to prove correctness of function 
foreach(var s in dic) 
    Console.WriteLine("{0}={1}", s.Key, s.Value); 
16

RandalSchwartzrule of thumb: split sử dụng khi bạn biết những gì bạn muốn vứt bỏ hoặc biểu thức thông thường khi bạn biết những gì bạn muốn giữ.

Bạn biết những gì bạn muốn giữ:

string sx="(colorIndex=3)(font.family=Helvetica)(font.bold=1)"; 

Regex pattern = new Regex(@"\((?<name>.+?)=(?<value>.+?)\)"); 

var d = new Dictionary<string,string>(); 
foreach (Match m in pattern.Matches(sx)) 
    d.Add(m.Groups["name"].Value, m.Groups["value"].Value); 

Với một chút nỗ lực, bạn có thể làm điều đó với ToDictionary:

var d = Enumerable.ToDictionary(
    Enumerable.Cast<Match>(pattern.Matches(sx)), 
    m => m.Groups["name"].Value, 
    m => m.Groups["value"].Value); 

Không chắc chắn cho dù điều này có vẻ đẹp hơn:

var d = Enumerable.Cast<Match>(pattern.Matches(sx)). 
    ToDictionary(m => m.Groups["name"].Value, 
       m => m.Groups["value"].Value); 
+3

+1 Chưa bao giờ nghe quy tắc đó trước đây, nhưng tôi thích nó! :) –

13
string sx = "(colorIndex=3)(font.family=Helvetica)(font.bold=1)"; 

var dict = sx.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries) 
      .Select(x => x.Split('=')) 
      .ToDictionary(x => x[0], y => y[1]); 
+0

Hmmm, tôi chỉ nhận thấy rằng đây là chức năng giống như câu trả lời của erikkallen, nhưng sử dụng cú pháp phương pháp mở rộng thay vì cú pháp truy vấn. – LukeH

+0

@Luke, với tôi câu trả lời của bạn dễ đọc hơn nhưng đó chỉ là định dạng. –

+0

@Tuzo: Tôi thường thích cú pháp phương pháp mở rộng quá, nhưng đó là tất cả theo sở thích cá nhân tôi nghĩ. – LukeH

0

Tôi chỉ đặt này ở đây để tham khảo ...

Đối với ASP.net, nếu bạn muốn phân tích một chuỗi từ phía khách hàng vào một cuốn từ điển này rất thuận tiện ...

Tạo một chuỗi JSON trên các mặt hàng khác, hoặc như thế này:

var args = "{'A':'1','B':'2','C':'" + varForC + "'}"; 

hay như thế này:

var args = JSON.stringify(new { 'A':1, 'B':2, 'C':varForC}); 

hoặc thậm chí như thế này:

var obj = {}; 
obj.A = 1; 
obj.B = 2; 
obj.C = varForC; 
var args = JSON.stringify(obj); 

chuyển nó đến máy chủ ...

sau đó phân tích nó ở phía máy chủ như thế này:

JavaScriptSerializer jss = new JavaScriptSerializer(); 
Dictionary<String, String> dict = jss.Deserialize<Dictionary<String, String>>(args); 

JavaScriptSerializer đòi hỏi System.Web.Script.Serialization.

3

Bạn có thể thử

string sx = "(colorIndex=3)(font.family=Helvetica)(font.bold=1)"; 

var keyValuePairs = sx.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries) 
      .Select(v => v.Split('=')) 
      .ToDictionary(v => v.First(), v => v.Last()); 
1

Thường được sử dụng cho tách truy vấn http.

Usage: Dictionary<string, string> dict = stringToDictionary("userid=abc&password=xyz&retain=false"); 

public static Dictionary<string, string> stringToDictionary(string line, char stringSplit = '&', char keyValueSplit = '=') 
{ 
    return line.Split(new[] { stringSplit }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Split(new[] { keyValueSplit })).ToDictionary(x => x[0], y => y[1]); ; 
} 
Các vấn đề liên quan