我有一个System.String由一系列用空格或逗号分隔的实数组成,如下所示:
“645.974,255.478 645.973,255.468 645.97 0 233.54 21”
我想解析我的字符串并用它的数字填充一个列表。我正在尝试找到执行此任务的最快方法。到目前为止,我已经尝试了以下方法,有一个 double 列表并解析字符串十万次。
List<double> MyList = new List<double>(250);
正则表达式:~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; } }
字符串拆分:~2[s]
MyList.Clear(); foreach (string point in Points.Split(Separators, StringSplitOptions.RemoveEmptyEntries)) MyList.Add(double.Parse(point, NumberStyles.AllowDecimalPoint));
有更好的选择吗?