2009-12-13 37 views
0

foreach(字符串x在Value.Split('|')) { var y = x.Split(',');分割字符串兩次並添加到字典

if (y.Length == 1) 
     Options.Add(y[0], y[0]); 
    else if (y.Length == 2) 
     Options.Add(y[0], y[1]); 
} 

應該處理字符串一樣:

  • b|123|1,op|999
  • 1|2|3|4

...,並將它們添加到Dictionary<string, string>。它將字符串拆分爲字符|。然後它再次分裂爲,這個字符。如果有一個元素,它會將相同的鍵和值添加到字典中。如果數組中有兩個元素,那麼當鍵是數組中的第一個元素時,它將添加到字典中,並且該值是數組中的第二個元素。

例如,在字符串中

b|123|1,op|999 

字典應該是這樣的:

Key | Value 
----------- 
b | b 
123 | 123 
1 | op 
999 | 999 

它的工作,但我正在尋找一個更清潔的方式來加速它的使用正則表達式或者什麼...該程序是,我不知道正則表達式...任何想法?

謝謝。

+2

你爲什麼需要加快步伐,是慢?不要過早優化,它看起來找我。 – 2009-12-13 14:14:11

+0

使用正則表達式不會更快嗎? – 2009-12-13 14:15:04

+3

正則表達式不比String.Split()快。簡單更好。 – 2009-12-13 14:15:10

回答

3

您可以用正則表達式是這樣做的:

foreach (Match m in Regex.Matches("b|123|1,op|999", "([^|,]+),([^|,]+)|([^|,]+)")) { 
    string value3 = m.Groups[3].Value; 
    if (value3.Length > 0) { 
     Options.Add(value3, value3); 
    } else { 
     Options.Add(m.Groups[1].Value, m.Groups[2].Value); 
    } 
} 

如果你衡量性能,我敢肯定的是,正則表達式的版本比較慢。

編輯:
下面是掃描分隔字符串,並且僅創建了在字典中使用的子串的技術:

string input = "b|123|1,op|999"; 
int key = 0; 
int value = 0; 
for (int i = 0; i < input.Length; i++) { 
    switch (input[i]) { 
     case ',': 
     value = i + 1; 
     break; 
     case '|': 
     Options.Add(input.Substring(key, key == value ? i - key : value - key - 1), input.Substring(value, i - value)); 
     key = i + 1; 
     value = i + 1; 
     break; 
    } 
} 
Options.Add(input.Substring(key, key == value ? input.Length - key : value - key - 1), input.Substring(value)); 
+0

你的編輯比我的代碼更快嗎? – 2009-12-13 15:46:01

+0

@Alon:是的。它快了一倍。 (我也衡量了正則表達式的版本,大約慢了10倍。) – Guffa 2009-12-13 16:48:14