字符串列表(String to list)

2019-10-16 14:53发布

我有一个System.String一系列用空格或逗号,这样的分离实数组成:

“645.974,255.478 645.973,255.468 645.97 0 233.54 21”

我想分析我的字符串,并填写一个表与它的数字。 我试图找到执行此任务的最快方法。 到目前为止,我曾尝试以下方法,具有双重的列表,并解析字符串十万次。

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)); 

有一个更好的选择吗?

Answer 1:

您可能需要评估你的程序的设计,看看是否可以分割你的“动态”字符串如果速度是你的关键。

例如,请问你的字符串进入你的计划吗? 为了使任何算法超高效,最好的办法(据我所知)是尽量压缩您的运营成一个单一的环...单环比多次循环自动更快。 一个简单的方法做,这是因为你知道你有一个尽快“听”为您的数据,因为它来的,成炭,逐字节字符,添加的有效实数到列表中。



文章来源: String to list