我有一个字符串,其中包含类似这样的图表数据。
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++;
}
非常感谢提前
答案 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,并优化内存消耗。