并行循环返回浮点数之和

Dav*_*ave 3 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;
}
Run Code Online (Sandbox Code Playgroud)

这是我的尝试:

Parallel.For(0, parts.Length, i =>
{
    float tmp;

    if (float.TryParse(parts[i], out tmp) || float.TryParse(parts[i].Replace('.', ','), out tmp))
        total += tmp;
});
Run Code Online (Sandbox Code Playgroud)

它返回一个浮点数,但是值是错误的。

我也尝试过这个

Parallel.For<float>(0, parts.Count, () => 0, (i, loop, subtotal) =>
    {
        total += result[i];
        return subtotal;
    },
    (x) => Interlocked.Add(ref sum, x)
);
Run Code Online (Sandbox Code Playgroud)

无法降低语法。

我也知道这听起来很荒谬,但是大多数示例都使用整数,最终它们使用了只接受int参数的Add方法,我显然不能使用它。

Mag*_*nus 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;
    });
Run Code Online (Sandbox Code Playgroud)

或使用 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();
Run Code Online (Sandbox Code Playgroud)