在C#中解析分隔字符串的最有效方法

时间:2012-12-04 01:23:07

标签: c#

有人提出了几种不同的方式,但我正在与另一位开发者就“我的方式”与“你的方式”进行辩论。语言是C#。

我想解析一个以管道分隔的字符串,其中每个块的前两个字符是我的标记。

规则。不是我的规则,而是我已经给出的规则,必须遵循。 我无法更改字符串的格式。 可能会多次调用此函数,因此效率是关键。 我需要保持简单。 我正在寻找的输入字符串和标签可能/将在运行时更改。

示例输入字符串:AOVALUE1 | ABVALUE2 | ACVALUE3 | ADVALUE4 示例标记我可能需要以下值:AB

我将字符串拆分为基于分隔符的数组,并在每次调用函数时循环遍历数组。然后我查看前两个字符并返回值减去前两个字符。

“其他人”的方法是获取字符串并使用IndexOf和SubString的组合来查找我正在寻找的字段的起点和终点。然后再次使用SubString拉取值减去前2个字符。所以他会说IndexOf(“| AB”)查找字符串中的下一个管道。这将是开始和结束。然后SubString出来。

现在我应该认为IndexOf和SubString每次都会在char级别的char级别解析字符串,所以这比使用大块并读取字符串减去前2个字符效率低。还是有另一种方式比我们两个人提出的更好吗?

4 个答案:

答案 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)

  • SubString不解析字符串。
  • IndexOf会解析字符串。

我的偏好是Split方法,主要是代码编码效率:

string[] inputArr = input.Split("|".ToCharArray()).Select(s => s.Substring(3)).ToArray();

非常简洁。 substring / indexof方法需要多少个LoC?