C# 将字符串拆分两次并添加到字典
foreach(Value.Split(“|”)中的字符串x) { 变量y=x.Split(',') 它应该处理如下字符串: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 -
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:是的,大约快了一倍。(我也测量了正则表达式版本,大约慢了十倍。)