如何在C#中对整数数组求和

146

除了迭代数组,还有更好的缩短方式吗?

int[] arr = new int[] { 1, 2, 3 };
int sum = 0;
for (int i = 0; i < arr.Length; i++)
{
    sum += arr[i];
}

澄清:

更好的主要方法是编写更干净的代码,但也欢迎有关性能改进的提示。(例如已经提到的:拆分大型数组)。


我并不是想寻求杀手级别的性能改进 - 我只是想知道这种语法糖是否已经可用:“已经有了String.Join - int[]怎么办?”。


2
更好在哪里?更快?更少的代码? - Fredrik Mörk
11个回答

0

对 Theodor Zoulias 的多核 Parallel.ForEach 实现的改进:

    public static ulong SumToUlongPar(this uint[] arrayToSum, int startIndex, int length, int degreeOfParallelism = 0)
    {
        var concurrentSums = new ConcurrentBag<ulong>();

        int maxDegreeOfPar = degreeOfParallelism <= 0 ? Environment.ProcessorCount : degreeOfParallelism;
        var options = new ParallelOptions() { MaxDegreeOfParallelism = maxDegreeOfPar };

        Parallel.ForEach(Partitioner.Create(startIndex, startIndex + length), options, range =>
        {
            ulong localSum = 0;
            for (int i = range.Item1; i < range.Item2; i++)
                localSum += arrayToSum[i];
            concurrentSums.Add(localSum);
        });

        ulong sum = 0;
        var sumsArray = concurrentSums.ToArray();
        for (int i = 0; i < sumsArray.Length; i++)
            sum += sumsArray[i];

        return sum;
    }

该实现适用于无符号整数数据类型,因为C#仅支持对int和long使用Interlocked.Add()。上述实现也可以轻松修改以支持其他整数和浮点数据类型,以使用CPU的多个核心并行进行求和。它在HPCsharp nuget包中使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接