并行循环返回浮点数的总和

时间:2014-10-20 20:23:25

标签: c# parallel-processing task-parallel-library

我想将这个简单的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参数,这显然是我无法使用的。

1 个答案:

答案 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();