Есть ли более короткий способ, чем повторение массива?
int[] arr = new int[] { 1, 2, 3 };
int sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
пояснение:
Лучшее первичное означает более чистый код, но также приветствуются намеки на повышение производительности. (Как уже упоминалось: разбиение больших массивов).
Не то чтобы я искал убийственного улучшения производительности - я просто подумал, не существует ли еще такого синтаксического сахара : «Есть String.Join - какого черта насчет int []?».
Ответы:
При условии, что вы можете использовать .NET 3.5 (или новее) и LINQ, попробуйте
источник
System.OverflowException
если результат будет больше, чем вы можете поместить в 32-битное целое число со знаком (т.е. (2 ^ 31) -1 или на английском языке ~ 2,1 миллиарда).int sum = arr.AsParallel().Sum();
более быстрая версия, использующая несколько ядер ЦП. Чтобы избежать того, чтоSystem.OverflowException
вы можете использоватьlong sum = arr.AsParallel().Sum(x => (long)x);
еще более быстрые версии, которые избегают исключения переполнения и поддерживают все целочисленные типы данных и используют параллельные инструкции SIMD / SSE для данных, взгляните на пакетДа, есть. С .NET 3.5:
Если вы не используете .NET 3.5, вы можете сделать это:
источник
foreach
Цикл доступен во всех версиях C #.foreach
просто заменяет одну строку кода другой и не короче. Кроме того, aforeach
прекрасно и более читабельно.foreach (int i in arr) sum += i;
С LINQ:
источник
Это зависит от того, как вы определитесь лучше. Если вы хотите, чтобы код выглядел чище, вы можете использовать .Sum (), как указано в других ответах. Если вы хотите, чтобы операция выполнялась быстро и у вас есть большой массив, вы можете сделать его параллельным, разбив его на промежуточные суммы, а затем суммируя результаты.
источник
Альтернативой также является использование
Aggregate()
метода расширения.источник
Если вы не предпочитаете LINQ, лучше использовать цикл foreach, чтобы избежать выхода из индекса.
источник
Для очень больших массивов может потребоваться выполнение вычислений с использованием более чем одного процессора / ядра машины.
источник
Одна из проблем с решениями цикла for выше заключается в том, что для следующего входного массива со всеми положительными значениями результат суммы отрицательный:
Сумма равна -2147483648, поскольку положительный результат слишком велик для типа данных int и принимает отрицательное значение.
Для того же входного массива предложения arr.Sum () вызывают исключение переполнения.
Более надежным решением является использование более крупного типа данных, такого как «длинный» в данном случае, для «суммы» следующим образом:
То же улучшение работает для суммирования других целочисленных типов данных, таких как short и sbyte. Для массивов беззнаковых целочисленных типов данных, таких как uint, ushort и byte, использование unsigned long (ulong) для суммы позволяет избежать исключения переполнения.
Решение цикла for также во много раз быстрее, чем Linq .Sum ()
Чтобы работать еще быстрее, пакет HPCsharp nuget реализует все эти версии .Sum (), а также версии SIMD / SSE и многоядерные параллельные версии, что во много раз увеличивает производительность.
источник
long sum = arr.Sum(x => (long)x);
которая хорошо работает на C # с помощью Linq. Он обеспечивает полную точность суммирования для всех целочисленных типов данных со знаком: sbyte, short и int. Он также позволяет избежать исключения переполнения и очень компактен. Это не такая высокая производительность, как в приведенном выше цикле for, но производительность требуется не во всех случаях.Использование foreach было бы более коротким кодом, но, вероятно, выполняло бы точно такие же шаги во время выполнения после того, как оптимизация JIT распознает сравнение с длиной в управляющем выражении цикла for.
источник
В одном из своих приложений я использовал:
источник
.Aggregate()
метода расширения.Улучшение красивой многоядерной реализации Parallel.ForEach Теодора Зулиаса:
который работает для целочисленных типов данных без знака, поскольку C # поддерживает только Interlocked.Add () для int и long. Вышеупомянутая реализация также может быть легко изменена для поддержки других типов данных с целыми числами и с плавающей запятой для параллельного суммирования с использованием нескольких ядер ЦП. Он используется в пакете nuget HPCsharp.
источник
Попробуйте этот код:
Результат:
источник