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

C# 并行循环返回浮点数的总和,c#,parallel-processing,task-parallel-library,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; } 它返回一个浮点值,但值是错误的 我也

我想把这个简单的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.Count,()=>0,(i,loop,subtotal)=>
{
总数+=结果[i];
返回小计;
},
(x) =>联锁。添加(参考和,x)
);
无法记下语法


我也知道这听起来很可笑,但大多数示例都是使用整数的,最终他们使用的方法Add只接受int参数,这显然是我无法使用的。

为了使使用更简单,请使用以下方法:

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();
var-bag=新的ConcurrentBag()//将保存每个线程的小计。
Parallel.For(0,parts.Count,()=>0,(i,state,subtotal)=>
{
浮动tmp;
if(float.TryParse(第[i]部分,输出tmp)| | float.TryParse(第[i]部分),替换(“,”,“,输出tmp))
小计+=tmp;
返回小计;
},
(x) =>袋子。添加(x));
var total=bag.Sum();

是的,我在Parallel.For上阅读了您的链接,但无法理解语法。你的答案很好,很简单,很有效。出于好奇,Parallel.For和AsParallel()是否具有类似的性能?是否有一个比另一个更好的情况?他们应该有类似的表现。和往常一样,在使用linq时,它会产生一点开销。但为了便于使用和代码可维护性,我会选择linq
Sum
解决方案。@Dave我已经用
并行更新了答案。对于
实现也一样。请记住,对于计算Sum之类的简单操作,线程所涉及的开销几乎肯定会超过并行计算的好处。@DanielMann在这种情况下,也会进行一些解析。
var total = 
    parts.AsParallel().Sum(x => 
    {
        float tmp;
        if (float.TryParse(x, out tmp) || float.TryParse(x.Replace('.', ','), out tmp))
            return tmp;
        return 0;
    });
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();