Programing

C #에서 정수 배열을 합산하는 방법

lottogame 2020. 8. 24. 20:54
반응형

C #에서 정수 배열을 합산하는 방법


거기에 더 나은 배열 반복보다 짧은 방법은?

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를 사용할 수있는 경우

int sum = arr.Sum();

네, 있습니다. .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);

LINQ 사용 :

arr.Sum()

어떻게 더 잘 정의 하느냐에 달려 있습니다. 코드가 더 깔끔해 보이기를 원한다면 다른 답변에서 언급했듯이 .Sum ()을 사용할 수 있습니다. 작업이 빠르게 실행되기를 원하고 큰 배열이있는 경우 하위 합계로 나누고 결과를 합산하여 병렬로 만들 수 있습니다.


LINQ를 선호하지 않는 경우 인덱스 부족을 방지하기 위해 foreach 루프를 사용하는 것이 좋습니다.

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

매우 큰 어레이의 경우 하나 이상의 프로세서 / 시스템 코어를 사용하여 계산을 수행하는 데 비용이들 수 있습니다.

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);
});

위의 for 루프 솔루션의 한 가지 문제는 모든 양수 값이있는 다음 입력 배열의 경우 합계 결과가 음수라는 것입니다.

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

양수 결과가 int 데이터 유형에 비해 너무 커서 음수 값으로 오버플로되기 때문에 합계는 -2147483648입니다.

동일한 입력 배열의 경우 arr.Sum () 제안으로 인해 오버플로 예외가 발생합니다.

A more robust solution is to use a larger data type, such as a "long" in this case, for the "sum" as follows:

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

The same improvement works for summation of other integer data types, such as short, and sbyte. For arrays of unsigned integer data types such as uint, ushort and byte, using an unsigned long (ulong) for the sum avoids the overflow exception.

The for loop solution is also many times faster than Linq .Sum()

To run even faster, HPCsharp nuget package implements all of these .Sum() versions as well as SIMD/SSE versions and multi-core parallel ones, for many times faster performance.


An alternative also it to use the Aggregate() extension method.

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

Using foreach would be shorter code, but probably do exactly the same steps at runtime after JIT optimization recognizes the comparison to Length in the for-loop controlling expression.


In one of my apps I used :

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

Try this code:

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);
        }
    }
} 

The result is:

23

참고URL : https://stackoverflow.com/questions/2419343/how-to-sum-up-an-array-of-integers-in-c-sharp

반응형