我想将这个简单的for循环转换为并行循环。它遍历一个字符串数组(从文本文件中读取的浮点数)并计算总和。
for (int i = 0; i < parts.Length; i++)
{
float tmp;
if (float.TryParse(parts[i], out tmp) || float.TryParse(parts[i].Replace('.', ','), out tmp))
total += tmp;
}
这是我的尝试:
Parallel.For(0, parts.Length, i =>
{
float tmp;
if (float.TryParse(parts[i], out tmp) || float.TryParse(parts[i].Replace('.', ','), out tmp))
total += tmp;
});
它返回一个浮点但值错误。
我也试过this one。
Parallel.For<float>(0, parts.Count, () => 0, (i, loop, subtotal) =>
{
total += result[i];
return subtotal;
},
(x) => Interlocked.Add(ref sum, x)
);
无法解决语法问题。
我也知道这听起来很荒谬,但大多数例子都是整数,最后他们使用的方法是Add只接受int参数,这显然是我无法使用的。
答案 0 :(得分:5)
为了方便使用以下内容:
var total =
parts.AsParallel().Sum(x =>
{
float tmp;
if (float.TryParse(x, out tmp) || float.TryParse(x.Replace('.', ','), out tmp))
return tmp;
return 0;
});
或使用Parallel.For
var bag = new ConcurrentBag<float>(); //Will hold the sub total for each thread.
Parallel.For<float>(0, parts.Count, () => 0, (i, state, subtotal) =>
{
float tmp;
if (float.TryParse(parts[i], out tmp) || float.TryParse(parts[i].Replace('.', ','), out tmp))
subtotal += tmp;
return subtotal;
},
(x) => bag.Add(x));
var total = bag.Sum();