我有一个由空格或逗号分隔的一系列实数组成的System.String,如下所示:
“645.974,255.478 645.973,255.468 645.97 0 233.54 21”
我想解析我的字符串并用list填充其数字。我正在努力找到执行此任务的最快方法。到目前为止,我已经尝试了以下方法,有一个double列表并解析字符串十万次。
List<double> MyList = new List<double>(250);
Regex:~8.56 [s]
MyList.Clear();
foreach (Match match in RgxDouble.Matches(Points))
MyList.Add(double.Parse(match.Value));
使用C ++ / CLI的非托管代码:~7.5 [s]
static void UsingUnmanagedCode(wchar_t* points, List<double> ^MyList)
{
static char buffer[MAX_CHARS];
wcstombs(buffer, points, MAX_CHARS);
char *start = buffer, *ptr = buffer;
for(; *ptr; ++ptr)
{
if(*ptr == ',')
*ptr = ' ';
}
while(*(--ptr) == ' ')
*ptr = '\0';
char *pEnd;
MyList->Add(strtod(start, &pEnd));
while(*pEnd)
{
char *pStart = pEnd;
MyList->Add(strtod(pStart, &pEnd));
}
}
C#和StringBuilder的不安全代码:~2.4 [s]
MyList.Clear();
fixed (char* fixPointsPtr = Points)
{
char* ptr = fixPointsPtr;
while (*ptr != '\0')
{
if ((*ptr < '0' || *ptr > '9') && *ptr != '-' && *ptr != '.')
{
MyList.Add(double.Parse(strBuild.ToString(0, strBuild.Length), NumberStyles.AllowDecimalPoint));
strBuild.Length = 0;
}
else
strBuild.Append(*ptr);
++ptr;
}
}
String Split:~2 [s]
MyList.Clear();
foreach (string point in Points.Split(Separators, StringSplitOptions.RemoveEmptyEntries))
MyList.Add(double.Parse(point, NumberStyles.AllowDecimalPoint));
有更好的选择吗?
答案 0 :(得分:3)
如果速度对您来说很重要,您可能需要评估程序的设计,看看是否可以“动态”拆分字符串。
例如,你的字符串如何进入你的程序?为了使任何算法都超高效,你最好的选择(据我所知)是尝试将你的操作压缩成一个循环......一个循环自动比多个循环更快。一个简单的方法就是“收听”数据进入,逐个字符,逐个字节,一旦你意识到你的数据就会在列表中添加一个有效的实数。