要列出的字符串<double> </double>

时间:2012-04-21 18:05:44

标签: .net string parsing

我有一个由空格或逗号分隔的一系列实数组成的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));
    

有更好的选择吗?

1 个答案:

答案 0 :(得分:3)

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

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