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

C# 将字符串拆分两次并添加到字典,c#,regex,C#,Regex,foreach(Value.Split(“|”)中的字符串x) { 变量y=x.Split(',') 它应该处理如下字符串: b|123|1,op|999 1 | 2 | 3 | 4 …并将它们添加到字典中。它将字符串拆分为字符|。然后将其再次拆分为字符,。如果有一个元素,它将向字典中添加相同的键和值。如果数组中有两个元素,则当键是第一个元素时,它会向字典中添加一个元素该值是数组中的第二个元素 例如,在字符串中: b|123|1,op|999 字典应该如下所示: Key | Value -

foreach(Value.Split(“|”)中的字符串x) { 变量y=x.Split(',')

它应该处理如下字符串:

  • b|123|1,op|999
  • 1 | 2 | 3 | 4
…并将它们添加到
字典中。它将字符串拆分为字符
|
。然后将其再次拆分为字符
。如果有一个元素,它将向字典中添加相同的键和值。如果数组中有两个元素,则当键是第一个元素时,它会向字典中添加一个元素该值是数组中的第二个元素

例如,在字符串中:

b|123|1,op|999
字典应该如下所示:

Key | Value
-----------
b   | b
123 | 123
1   | op
999 | 999
这是工作,但我正在寻找一个更干净的方式来加快它使用正则表达式或其他…程序是,我不知道正则表达式…任何想法


谢谢。

您可以使用如下正则表达式:

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));
string input=“b | 123 | 1,op | 999”;
int键=0;
int值=0;
for(int i=0;i
您可以使用如下正则表达式:

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));
string input=“b | 123 | 1,op | 999”;
int键=0;
int值=0;
for(int i=0;i
为什么需要加快速度,速度慢吗?不要过早优化,我觉得它很好。使用regex不是更快吗?regex不比String.Split()快.Simple更好。不,不会。有很多方法可以做得更快,但这些方法与正则表达式无关。我在C#方面非常弱。你能在不创建新字符串的情况下进行拆分吗?手动-逐字符遍历并手动实现拆分-这将更复杂、更容易出错,但我相信速度更快。你为什么需要加快拆分速度,是吗ow?不要过早地进行优化,在我看来,它是可以找到的。使用正则表达式不是更快吗?正则表达式不比String.Split()快.Simple更好。不,不会。有很多方法可以做得更快,但这些方法与正则表达式无关。我在C#方面非常弱。你能在不创建新字符串的情况下进行拆分吗?手动-逐字符遍历并手动实现拆分-这将更复杂、更容易出错,但我相信速度更快。@Alon:是的,速度大约是原来的两倍。(我也测量了正则表达式版本,大约慢了十倍。)@Alon:是的,大约快了一倍。(我也测量了正则表达式版本,大约慢了十倍。)