C# 在C中解析分隔字符串的最有效方法#
这已经被问到了一些不同的方式,但我正在与另一个开发者讨论“我的方式”和“你的方式”。语言是C# 我想解析一个管道分隔的字符串,其中每个块的前2个字符是我的标记 规则。不是我的规则,而是我被赋予并必须遵守的规则。 我无法更改字符串的格式。 此函数可能会被多次调用,因此效率是关键。 我需要保持简单。 我正在查找的输入字符串和标记可能/将在运行时更改 输入字符串示例:AOVALUE1 | ABVALUE2 | ACVALUE3 | ADVALUE4 示例标记我可能需要:AB的值 我根据分隔符将字符串拆分为一个数组,并在每次调用函数时循环数组。然后我看了前2个字符,返回值减去前2个字符 “其他人”的方法是使用字符串并使用IndexOf和SubString的组合来查找我要查找的字段的起点和终点。然后再次使用SubString拉出减去前2个字符的值。所以他会说IndexOf(“| AB”)是找到字符串中的下一根管道。这将是开始和结束。然后将其子串出来 现在我应该认为IndexOf和SubString每次都会在逐字符级别解析字符串,因此这比使用大块并读取字符串减去前2个字符的效率要低。或者有没有其他方法比我们两人提出的更好?我已经用C语言做了很多分析,我可能会采用“其他人”建议的方法,因为这样会减少资源使用,而且可能会更快一些 也就是说,只要数据不是太大,第一种方法就没有问题,而且编程也会容易得多。我已经用C语言做了很多解析,我可能会采用“其他人”建议的方法,因为这样会减少资源使用量,而且可能会更快一些C# 在C中解析分隔字符串的最有效方法#,c#,C#,这已经被问到了一些不同的方式,但我正在与另一个开发者讨论“我的方式”和“你的方式”。语言是C# 我想解析一个管道分隔的字符串,其中每个块的前2个字符是我的标记 规则。不是我的规则,而是我被赋予并必须遵守的规则。 我无法更改字符串的格式。 此函数可能会被多次调用,因此效率是关键。 我需要保持简单。 我正在查找的输入字符串和标记可能/将在运行时更改 输入字符串示例:AOVALUE1 | ABVALUE2 | ACVALUE3 | ADVALUE4 示例标记我可能需要:AB的值 我根据分隔符将字符串拆
也就是说,只要数据不是太大,第一种方法就没有问题,而且编程也会容易得多。类似的方法可能行得通
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