有人提出了几种不同的方式,但我正在与另一位开发者就“我的方式”与“你的方式”进行辩论。语言是C#。
我想解析一个以管道分隔的字符串,其中每个块的前两个字符是我的标记。
规则。不是我的规则,而是我已经给出的规则,必须遵循。 我无法更改字符串的格式。 可能会多次调用此函数,因此效率是关键。 我需要保持简单。 我正在寻找的输入字符串和标签可能/将在运行时更改。
示例输入字符串:AOVALUE1 | ABVALUE2 | ACVALUE3 | ADVALUE4 示例标记我可能需要以下值:AB
我将字符串拆分为基于分隔符的数组,并在每次调用函数时循环遍历数组。然后我查看前两个字符并返回值减去前两个字符。
“其他人”的方法是获取字符串并使用IndexOf和SubString的组合来查找我正在寻找的字段的起点和终点。然后再次使用SubString拉取值减去前2个字符。所以他会说IndexOf(“| AB”)查找字符串中的下一个管道。这将是开始和结束。然后SubString出来。
现在我应该认为IndexOf和SubString每次都会在char级别的char级别解析字符串,所以这比使用大块并读取字符串减去前2个字符效率低。还是有另一种方式比我们两个人提出的更好吗?
答案 0 :(得分:2)
由于每次都需要重新评估输入字符串,因此另一个人的方法会更有效率。如果输入字符串很长,那么也不需要分割字符串的额外内存。
如果我正在尝试编写一个非常紧密的循环,我更喜欢直接使用数组/字符串运算符而不是LINQ来避免额外的开销:
string inputString = "AOVALUE1|ABVALUE2|ACVALUE3|ADVALUE4";
static string FindString(string tag)
{
int startIndex;
if (inputString.StartsWith(tag))
{
startIndex = tag.Length;
}
else
{
startIndex = inputString.IndexOf(string.Format("|{0}", tag));
if (startIndex == -1)
return string.Empty;
startIndex += tag.Length + 1;
}
int endIndex = inputString.IndexOf('|', startIndex);
if (endIndex == -1)
endIndex = inputString.Length;
return inputString.Substring(startIndex, endIndex - startIndex);
}
答案 1 :(得分:1)
我已经在C#中完成了很多解析,我可能会采用“其他人”建议的方法,因为它会对使用的资源稍微轻一点,并且很可能是也快一点。
也就是说,只要数据不是太大,第一种方法就没有问题,编程会更容易。
答案 2 :(得分:1)
这样的东西可以正常工作
string myString = "AOVALUE1|ABVALUE2|ACVALUE3|ADVALUE4";
string selector = "AB";
var results = myString.Split('|').Where(x => x.StartsWith(selector)).Select(x => x.Replace(selector, ""));
返回:匹配列表,在这种情况下只有一个“VALUE2”
如果您只是寻找第一场或唯一一场比赛,这将有效。
string result = myString.Split('|').Where(x => x.StartsWith(selector)).Select(x => x.Replace(selector, "")).FirstOrDefault();
答案 3 :(得分:0)
我的偏好是Split方法,主要是代码编码效率:
string[] inputArr = input.Split("|".ToCharArray()).Select(s => s.Substring(3)).ToArray();
非常简洁。 substring / indexof方法需要多少个LoC?