[c#] 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 ()을 사용할 수 있습니다. 작업이 빠르게 실행되기를 원하고 큰 배열이있는 경우 하위 합계로 나누고 결과를 합산하여 병렬로 만들 수 있습니다.


답변

Aggregate()확장 방법 을 사용하는 대안도 있습니다 .

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


답변

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