1

我有一个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));
    

有更好的选择吗?

4

1 回答 1

3

如果速度对您很重要,您可能需要评估程序的设计,看看是否可以“即时”拆分字符串。

例如,你的字符串是如何进入你的程序的?为了使任何算法都非常高效,你最好的选择(据我所知)是尝试将你的操作压缩到一个循环中……一个循环自动比多个循环快。一个简单的方法是“监听”你的数据,一个字符一个字符,一个字节一个字节,一旦你意识到你有一个有效的实数到你的列表中。

于 2012-04-21T18:12:55.143 回答