如何在C#中总结一个整数数组

时间:2010-03-10 18:06:46

标签: c# arrays integer

是否有更好比迭代数组更短的方式?

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

澄清:

更好的主要意味着更清洁的代码,但也欢迎提示性能提升。 (就像已经提到的:拆分大型数组)。


这并不像我在寻找杀手性能提升 - 我只是想知道这种非常强烈的语法糖是不是已经可用:“有String.Join - 关于int []到底是什么?”。

11 个答案:

答案 0 :(得分:155)

如果您可以使用C#3.5和LINQ,请尝试

int sum = arr.Sum();

答案 1 :(得分:62)

是的。使用.NET 3.5:

int sum = arr.Sum();
Console.WriteLine(sum);

如果你不使用.NET 3.5,你可以这样做:

int sum = 0;
Array.ForEach(arr, delegate(int i) { sum += i; });
Console.WriteLine(sum);

答案 2 :(得分:19)

使用LINQ:

arr.Sum()

答案 3 :(得分:5)

这取决于你如何更好地定义。如果您希望代码看起来更干净,可以使用其他答案中提到的.Sum()。如果您希望操作快速运行并且您有一个大型数组,您可以通过将其分成子总和然后对结果求和来使其平行。

答案 4 :(得分:2)

如果你不喜欢LINQ,最好使用foreach循环来避免索引。

int[] arr = new int[] { 1, 2, 3 };
int sum = 0;
foreach (var item in arr)
{
   sum += item;
}

答案 5 :(得分:1)

对于非常大的阵列,可能需要使用不止一个机器的处理器/内核来执行计算。

nanoSuit

答案 6 :(得分:0)

使用foreach将是更短的代码,但是在JIT优化识别出与for循环控制表达式中的Length的比较之后,可能在运行时执行完全相同的步骤。

答案 7 :(得分:0)

在我使用的一个应用中:

public class ClassBlock
{
    public int[] p;
    public int Sum
    {
        get { int s = 0;  Array.ForEach(p, delegate (int i) { s += i; }); return s; }
    }
}

答案 8 :(得分:0)

也可以使用const db = require('./db'); // provides the mongoDB connection const mongoose = require('mongoose'); const ObjectId = require('mongoose').Types.ObjectId; const Job = require('./schemas/jobs').Job module.exports.createJob = function (newJob) { const job = new Job(newJob); return new Promise((resolve, reject) => { job.save((err, data) => { if (err) { reject(err); } else { resolve(data); } }); }); }; 扩展方法。

Aggregate()

答案 9 :(得分:-1)

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软件包中使用。

答案 10 :(得分:-5)

试试这段代码:

$ time env LC_ALL=C gsort --parallel=8 /tmp/rand.csv > /tmp/shuffled.csv

#! /usr/bin/env python3

import base64
import csv
import hashlib
import re
import time


def prepend(infile, outfile):
    """Turns the input CSV into one that has hex hashes in column 1."""
    with open(infile) as fin, open(outfile, 'w') as fout:
        insheet = csv.reader(fin)
        outsheet = csv.writer(fout)
        for i, word in insheet:
            hex = hashlib.sha224(word.encode()).hexdigest()[:12]
            outsheet.writerow((hex, i, word))


def gen(outfile, n=123456789, seed='foo'):
    num_word_re = re.compile(r'([a-zA-Z]\w{7})')
    just_alnum = str.maketrans('', '', '+/')
    with open(outfile, 'w') as fout:
        sheet = csv.writer(fout)
        for i in range(1, n + 1):
            sha = hashlib.sha224(f'{seed}{str(i)}'.encode())
            dig = sha.digest()
            text = base64.b64encode(dig).decode()
            m = num_word_re.search(text.translate(just_alnum))
            sheet.writerow((i, str(dig[-1] % 10) + m.group(1)))


if __name__ == '__main__':
    big = '/tmp/big.csv'
    gen(big)
    t0 = time.time()
    prepend(big, '/tmp/rand.csv')
    print('%.3f sec.' % (time.time() - t0))

==> /tmp/rand.csv <==
b784b9e91557,123456786,8vdzlXU0k
6b545b9a8be8,123456787,1tfemzO0R
40ae0bfea89b,123456788,0Ua8LYuK8
c461c832b5aa,123456789,0y91nshi6

==> /tmp/shuffled.csv <==
ffffff1db601,117611393,3TCHPS1tD
ffffff3d6962,110031982,7jzzKwrNz
ffffff468062,20413362,6juuxuPN2
ffffff81de0a,102223550,2p91NhYXq

结果是:

  

23