是否有更好比迭代数组更短的方式?
int[] arr = new int[] { 1, 2, 3 };
int sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
澄清:
更好的主要意味着更清洁的代码,但也欢迎提示性能提升。 (就像已经提到的:拆分大型数组)。
这并不像我在寻找杀手性能提升 - 我只是想知道这种非常强烈的语法糖是不是已经可用:“有String.Join - 关于int []到底是什么?”。
答案 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