繁体   English   中英

解析C#中定界字符串的最有效方法

[英]Most efficient way to parse a delimited string in C#

人们用几种不同的方式问了这个问题,但是我正在与另一位开发人员讨论“我的方式”与“您的方式”的争论。 语言是C#。

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

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

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

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

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

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

鉴于每次都需要重新评估输入字符串,因此其他人的方法在时间上将更加高效。 如果输入字符串很长,则也不需要拆分字符串会占用额外的内存。

如果我想编写一个非常紧密的循环,我宁愿直接使用数组/字符串运算符而不是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);
}

我已经在C#中完成了很多解析,并且我可能会采用“其他人”建议的方法,只是因为它可以减少所用资源的数量,并且速度也可能更快一些。

就是说,只要数据不是太大,第一种方法就没有什么错,并且编程起来会容易得多。

这样的事情可能会好的

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();
  • SubString不会解析该字符串。
  • IndexOf会解析字符串。

我的首选是Split方法,主要是代码编码效率:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM