从C#</string>中的List <string>中提取double值的有效方法

时间:2011-11-02 10:46:32

标签: c# .net

我有一个字符串,其中包含类似这样的图表数据。

string sGraph = "0.05 /m 0.05 /m 0.05 /m 0.05 /m 0.05 /m 0.05 /m 0.05 /m 0.05....... 0.05 /m";

我必须在double []或者List中提取double值以进行进一步处理。对于前者

List<String> sGraphPoints = Regex.Split(sGraph, " /m").ToList<string>();

检索字符串列表中的double值。然后,我可以使用字符串列表中的每个值进行进一步处理。有没有一种有效的方法可以做同样的事情,而不是将每个字符串变量值转换为double,如下所示......

double[] dGraphPoints = new double[sGraphPoints.Count];
            int i = 0;
            foreach (string str in sGraphPoints)
            {
                if (str != "")
                {
                    dGraphPoints[i] = double.Parse(str);
                }
                else 
                {
                    dGraphPoints[i] = 0.0;
                }

               i++;
            }

非常感谢提前

2 个答案:

答案 0 :(得分:4)

double[] dGraphPoints = sGraph.Split("/m")
                              .Select(s => s.Trim())
                              .Where(s => !string.IsNullOrEmpty(s))
                              .Select(s => Double.Parse(s))
                              .ToArray()

这只是稍微“有效”,因为它没有使用正则表达式而且它之间没有创建额外的列表。

但实际上,它取决于你使用的是什么价值?您可以修改where子句以仅选择您感兴趣的值,但我不知道它们会是什么。

答案 1 :(得分:0)

像这样;

public static IList<double> Parse(string text)
{
    List<double> list = new List<double>();
    if (text != null)
    {
        StringBuilder dbl = new StringBuilder(30); 
        for (int i = 0; i < text.Length; i++)
        {
            if (text[i] == 'm')
            {
                list.Add(double.Parse(dbl.ToString(), CultureInfo.InvariantCulture));
                dbl.Length = 0;
            }
            else
            {
                if ((text[i] != ' ') && (text[i] != '/'))
                {
                    dbl.Append(text[i]);
                }
            }
        }
    }
    return list;
}

它不使用Regex,只分配所需的数组和固定大小的StringBuilder。如果文本是作为TextReader而不是字符串提供的,则可以将返回的IList更改为IEnumerable,使用yield而不是Add,并优化内存消耗。