拆分字符串两次并添加到字典

时间:2009-12-13 14:08:44

标签: c# regex

foreach(Value.Split中的字符串x('|'))     {         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

它正在工作,但我正在寻找一种更干净的方法来加速它使用正则表达式或其他东西......程序是我不知道正则表达式...任何想法?

感谢。

1 个答案:

答案 0 :(得分: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));