Как суммировать массив целых чисел в С#

Есть ли лучше более короткий путь, чем итерация по массиву?

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

уточнение:

Улучшенный первичный код означает более чистый код, но подсказки по повышению производительности также приветствуются. (Как уже упоминалось: расщепление больших массивов).


Не похоже, чтобы я искал улучшения производительности убийцы. Я просто задавался вопросом, не был ли уже этот синтаксический сахар : "Там String.Join - что за черт о int []?".

Ответ 1

При условии, что вы можете использовать .NET 3.5 (или новее) и LINQ, попробуйте

int sum = arr.Sum();

Ответ 2

Да, есть. С .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);

Ответ 3

С LINQ:

arr.Sum()

Ответ 4

Это зависит от того, как вы лучше определяете. Если вы хотите, чтобы код выглядел более чистым, вы можете использовать .Sum(), как упоминалось в других ответах. Если вы хотите, чтобы операция выполнялась быстро, и у вас большой массив, вы можете сделать ее параллельной, разбив ее на субсы и затем суммировать результаты.

Ответ 5

Если вы не предпочитаете LINQ, лучше использовать цикл foreach, чтобы избежать индекса.

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

Ответ 6

Одна проблема с вышеупомянутыми решениями для цикла заключается в том, что для следующего входного массива со всеми положительными значениями результат суммы будет отрицательным:

int[] arr = new int[] { Int32.MaxValue, 1 };
int sum = 0;
for (int i = 0; i < arr.Length; i++)
{
    sum += arr[i];
}
Console.WriteLine(sum);

Сумма равна -2147483648, поскольку положительный результат слишком велик для типа данных int и переходит в отрицательное значение.

Для того же входного массива предложения arr.Sum() вызывают исключение переполнения.

Более надежное решение состоит в том, чтобы использовать больший тип данных, такой как "long" в данном случае, для "sum" следующим образом:

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

Такое же улучшение работает для суммирования других целочисленных типов данных, таких как short и sbyte. Для массивов целочисленных типов данных без знака, таких как uint, ushort и byte, использование без знака long (ulong) для суммы позволяет избежать исключения переполнения.

Решение для цикла for также во много раз быстрее, чем Linq.Sum()

Чтобы работать еще быстрее, пакет HPCsharp nuget реализует все эти версии .Sum(), а также версии SIMD/SSE и многоядерные параллельные версии, что во много раз повышает производительность.

Ответ 7

Для очень больших массивов может потребоваться выполнить вычисления, используя более одного процессора/ядра машины.

long sum = 0;
var options = new ParallelOptions()
    { MaxDegreeOfParallelism = Environment.ProcessorCount };
Parallel.ForEach(Partitioner.Create(0, arr.Length), options, range =>
{
    long localSum = 0;
    for (int i = range.Item1; i < range.Item2; i++)
    {
        localSum += arr[i];
    }
    Interlocked.Add(ref sum, localSum);
});

Ответ 8

Использование foreach будет короче кода, но, вероятно, сделает точно такие же шаги во время выполнения после того, как оптимизация JIT распознает сравнение с длиной в управляющем выражении for-loop.

Ответ 9

В одном из моих приложений я использовал:

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

Ответ 10

Альтернативой также является использование метода расширения Aggregate().

var sum = arr.Aggregate((temp, x) => temp+x);

Ответ 11

using System;
using System.Collections.Generic;

{
    class Program
    {
        static void Main(string[] args)
        {
            int sum = 0;
            int[] arr = new int[8] { 10, 20, 30, 40, 5, 6, 7, 8 };
            for (int i = 0; i < arr.Length; i++)
            {
                sum += arr[i];

            }
        }
    }
}

Ответ 12

Вы можете сделать это одним из способов:

 1] int sum = items.Sum(); 
    Or
 2] Array.ForEach(items, x=> sum += x);

Ответ 13

Попробуйте этот код:

using System;

namespace Array
{
    class Program
    {
        static void Main()
        {
            int[] number = new int[] {5, 5, 6, 7};

            int sum = 0;
            for (int i = 0; i <number.Length; i++)
            {
                sum += number[i];
            }
            Console.WriteLine(sum);
        }
    }
} 

Результат:

23