谁能告诉我正确的Plinq代码是什么?我将一个 double 数组的每个元素的正弦值的绝对值的平方根加起来,但是Plinq给我错误的结果。

该程序的输出为:

Linq聚合= 75.8310477905274(正确)
Plinq聚合= 38.0263653589291(约为应有的一半)

我一定做错了,但我无法解决...

(我正在Core 2 Duo Windows 7 x64 PC上与Visual Studio 2008一起运行此程序。)

这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            double[] array = new double[100];

            for (int i = 0; i < array.Length; ++i)
            {
                array[i] = i;
            }

            double sum1 = array.Aggregate((total, current) => total + Math.Sqrt(Math.Abs(Math.Sin(current))));
            Console.WriteLine("Linq aggregate = " + sum1);

            IParallelEnumerable<double> parray = array.AsParallel<double>();
            double sum2 = parray.Aggregate((total, current) => total + Math.Sqrt(Math.Abs(Math.Sin(current))));
            Console.WriteLine("Plinq aggregate = " + sum2);
        }
    }
}

最佳答案

聚合在PLINQ中的工作方式略有不同。
MSDN Blogs:

public static double Average(this IEnumerable<int> source)
{
    return source.AsParallel().Aggregate(
        () => new double[2],
        (acc, elem) => { acc[0] += elem; acc[1]++; return acc; },
        (acc1, acc2) => { acc1[0] += acc2[0]; acc1[1] += acc2[1]; return acc1; },
        acc => acc[0] / acc[1]);
}

因此,在您的情况下,您还需要传递一个累加器函数,该函数对并行聚合的输出求和(因此,您看到的结果大约是应有结果的一半)。

关于c# - Plinq与Linq给出的结果不同-我做错了什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/857107/

10-10 21:42