2009-12-13 85 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