解析此字符串的最快方法是什么

Ang*_*ker 0 c# performance parsing .net-2.0

我有一个字符串,格式如下:

[季节] [年] [供应商] [地理]

所以一个例子可能是:2009年春季尼尔森MSA

我需要能够以最快的方式解析季节和年份.我不关心漂亮或聪明.只是原始速度.该语言是使用VS2008的C#,但该程序集是为.NET 2.0构建的

Jon*_*eet 11

如果你只需要季节和年份,那么:

int firstSpace = text.IndexOf(' ');
string season = text.Substring(0, firstSpace);
int secondSpace = text.IndexOf(' ', firstSpace + 1);
int year = int.Parse(text.Substring(firstSpace + 1, 
                                    secondSpace - firstSpace - 1));
Run Code Online (Sandbox Code Playgroud)

如果你可以假设年份总是四位数,那就更快了:

int firstSpace = text.IndexOf(' ');
string season = text.Substring(0, firstSpace);
int year = int.Parse(text.Substring(firstSpace + 1, 4));
Run Code Online (Sandbox Code Playgroud)

如果另外你知道所有年份都在21世纪,它可以变得愚蠢地最佳:

int firstSpace = text.IndexOf(' ');
string season = text.Substring(0, firstSpace);
int year = 2000 + 10 * (text[firstSpace + 3] - '0') 
                + text[firstSpace + 4] - '0';
Run Code Online (Sandbox Code Playgroud)

它变得更不易读,但可能更快(取决于JIT的作用):

int firstSpace = text.IndexOf(' ');
string season = text.Substring(0, firstSpace);
int year = 1472 + 10 * text[firstSpace + 3] + text[firstSpace + 4];
Run Code Online (Sandbox Code Playgroud)

就个人而言,我认为至少迈出了一步,但是:)

编辑:好的,把它带到极端......你只会有几个季节,对吧?假设他们是"春天","夏天","秋天","冬天",那么你可以这样做:

string season;
int yearStart;
if (text[0] == 'S')
{
    season = text[1] == 'p' ? "Spring" : "Summer";
    yearStart = 7;
}
else if (text[0] == 'F')
{
    season = "Fall";
    yearStart = 5;
}
else
{
    season = "Winter";
    yearStart = 7;
}

int year = 1472 + 10 * text[yearStart + 2] + text[yearStart + 3];
Run Code Online (Sandbox Code Playgroud)

这样做的好处是它将重用相同的字符串对象.当然,它假设数据从未出现过任何问题......

使用SplitSpidey的回答肯定比任何一个简单,但我怀疑它会稍微慢一些.说实话,我至少先尝试一下 ......你测量过最简单的代码并发现它太慢了吗?差异可能非常小 - 当然,与您首先在数据中读取的任何网络或磁盘访问相比.


Gro*_*roo 5

要添加到其他答案,如果您希望它们采用以下格式:

Spring xxxx
Summer xxxx
Autumn xxxx
Winter xxxx
Run Code Online (Sandbox Code Playgroud)

那么更快的方法是:

string season = text.Substring(0, 6);
int year = int.Parse(text.Substring(7, 4);
Run Code Online (Sandbox Code Playgroud)

但这相当令人讨厌的.:)

甚至不会考虑像这样编码.

  • 我希望乔恩的意思是"秋天",而不是"春天" (2认同)