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

C# 在C中解析分隔字符串的最有效方法#,c#,C#,这已经被问到了一些不同的方式,但我正在与另一个开发者讨论“我的方式”和“你的方式”。语言是C# 我想解析一个管道分隔的字符串,其中每个块的前2个字符是我的标记 规则。不是我的规则,而是我被赋予并必须遵守的规则。 我无法更改字符串的格式。 此函数可能会被多次调用,因此效率是关键。 我需要保持简单。 我正在查找的输入字符串和标记可能/将在运行时更改 输入字符串示例:AOVALUE1 | ABVALUE2 | ACVALUE3 | ADVALUE4 示例标记我可能需要:AB的值 我根据分隔符将字符串拆

这已经被问到了一些不同的方式,但我正在与另一个开发者讨论“我的方式”和“你的方式”。语言是C#

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

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

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

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

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

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

我已经用C语言做了很多分析,我可能会采用“其他人”建议的方法,因为这样会减少资源使用,而且可能会更快一些

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

我已经用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();

像这样的东西可能行

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();
  • 子字符串不分析字符串
  • IndexOf解析字符串
我的首选是拆分方法,主要是代码编码效率:

string[] inputArr = input.Split("|".ToCharArray()).Select(s => s.Substring(3)).ToArray();
它相当简洁。substring/indexof方法需要多少LoC?

  • 子字符串不分析字符串
  • IndexOf解析字符串
我的首选是拆分方法,主要是代码编码效率:

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

它相当简洁。substring/indexof方法需要多少LoC?

考虑到每次都需要重新计算输入字符串,另一个人的方法在时间上会更有效。如果输入字符串很长,它也不会像拆分字符串那样需要额外的内存

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

考虑到每次都需要重新评估输入字符串,另一个人的方法在时间上会更有效。如果输入字符串很长,它也不会像拆分字符串那样需要额外的内存

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

每次调用该函数时,我要查找的整个字符串和标记都将进入。输入字符串也可能变大。根据我的字符串示例,我可以有20多个未知长度的标记。每次调用函数时,我要查找的整个字符串和标记都将进入。输入字符串也可能变大。根据我的字符串示例,我可以有20多个未知长度的标记。System.Linq.Enumerable+WhereSelectArrayIterator`2[System.String,System.String]它返回一个匹配列表(IEnumerable)。我不确定您是否期望多个resultUpdated答案只返回一个看起来有效的结果/匹配。简单的一行。为了得到第一个标记AO,我必须修改的一件事是在它前面插入(“|”)。除此之外,这是一个很好的解决方案。System.Linq.Enumerable+WhereSelectArrayIterator`2[System.String,System.String]它返回一个匹配列表(IEnumerable)。我不确定您是否期望多个resultUpdated答案只返回一个看起来有效的结果/匹配。简单的一行。为了得到第一个标记AO,我必须修改的一件事是在它前面插入(“|”)。除此之外,这是一个很好的解决方案。如果输入字符串不经常更改,那么您可以创建一个字典,在其中对字符串进行一次解析,然后执行字典。为每个标记/值对添加(标记,值)。你也可以做一些延迟加载,你解析字符串的一部分,直到你找到你想要的值(同时将你找到的所有东西都添加到字典中),然后下次你搜索dict。如果你没有找到它,继续解析。想想看。输入字符串和标记几乎每次都会更改。我建议使用集合的各种方法,但建议使用某种类型的解析。如果输入字符串不经常更改,则可以创建一个字典,在其中对字符串进行一次解析,然后执行字典。为每个标记/值对添加(标记,值)。YouC