次のように、スペースまたはコンマで区切られた一連の実数で構成されるSystem.Stringがあります。
"645.974,255.478 645.973,255.468 645.97 0 233.54 21"
文字列を解析し、リストにその番号を入力したいと考えています。このタスクを実行する最も速い方法を見つけようとしています。これまでのところ、二重のリストを持ち、文字列を10万回解析して、次の方法を試しました。
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));
より良い代替手段はありますか?