0

这已经被问了几种不同的方式,但我正在与另一位开发人员讨论“我的方式”与“你的方式”。语言是 C#。

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

规则。不是我的规则,而是我被赋予并且必须遵守的规则。我无法更改字符串的格式。这个函数可能会被调用很多次,所以效率是关键。我需要保持很简单。我正在寻找的输入字符串和标签可能/将在运行时更改。

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

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

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

现在我应该认为 IndexOf 和 SubString 每次都会在逐个字符级别解析字符串,因此这比使用大块并读取字符串减去前 2 个字符的效率要低。或者有没有比我们俩提议的更好的方法?

4

4 回答 4

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);
}
于 2012-12-04T01:49:36.167 回答
1

我已经在 C# 中进行了很多解析,我可能会采用“其他人”建议的方法,因为它使用的资源会更轻一些,而且可能也会更快一些。

也就是说,只要数据不是太大,第一种方法就没有问题,并且它会更容易编程。

于 2012-12-04T01:29:47.620 回答
0

像这样的东西可能工作正常

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();
于 2012-12-04T01:34:07.357 回答
0
  • SubString 不解析字符串。
  • IndexOf 会解析字符串。

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

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

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

于 2012-12-04T01:35:40.090 回答