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

Fil*_*urt 100 c# arrays integer

有没有比迭代数组更好的方法?

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

澄清:

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


这并不像我在寻找杀手性能改进 - 我只是想知道这种语法糖是否已经不可用:"有String.Join - 关于int []到底是什么?".

Tom*_*ana 169

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

int sum = arr.Sum();
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,如果结果大于您可以放入有符号的32位整数(即(2 ^ 31)-1或英语~21亿),则会引发错误`System.OverflowException`. (10认同)
  • 身份lambda不是必需的.除了让团队中的新人混淆. (9认同)
  • `int sum = arr.AsParallel().Sum();` 是一个使用多个 CPU 核心的更快版本。为了避免“System.OverflowException”,您可以使用“long sum = arr.AsParallel().Sum(x =&gt; (long)x);”以获得更快的版本,避免溢出异常并支持所有整数数据类型并使用数据并行SIMD/SSE指令,看看HPCsharp nuget包 (2认同)

Ahm*_*eed 64

就在这里.使用.NET 3.5:

int sum = arr.Sum();
Console.WriteLine(sum);
Run Code Online (Sandbox Code Playgroud)

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

int sum = 0;
Array.ForEach(arr, delegate(int i) { sum += i; });
Console.WriteLine(sum);
Run Code Online (Sandbox Code Playgroud)

  • 为什么这么复杂的前3.5版?所有版本的C#都提供`foreach`循环. (2认同)
  • @Jørn:OP要求采用更短的方法.`foreach`只是将一行代码替换为另一行代码而不是更短.除此之外,"foreach"非常精细且更具可读性. (2认同)
  • 采取的点.然而,与你的样本相比,以下节省了18个字符:`foreach(int in arr)sum + = i;` (2认同)

ja7*_*a72 6

另一种方法是使用Aggregate()扩展方法。

var sum = arr.Aggregate((temp, x) => temp+x);
Run Code Online (Sandbox Code Playgroud)

  • 这似乎在 Sum 不起作用的地方起作用。由于某种原因,它不适用于 uint 数组,但 Aggregate 可以。 (2认同)

unh*_*ler 5

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

  • 我怀疑在这样的并行优化才有意义之前,它必须是一个非常大的数组. (3认同)