2010-03-10 46 views
64

Có cách nào tốt hơn ngắn hơn so với lặp qua mảng không?Cách tổng hợp một mảng các số nguyên trong C#

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

làm rõ:

Better tiểu học có nghĩa là mã sạch nhưng gợi ý về cải thiện hiệu suất là cũng hoan nghênh. (Như đã đề cập: tách mảng lớn).


Nó không giống như tôi đang tìm kiếm cải thiện hiệu suất killer - Tôi chỉ tự hỏi nếu loại này rất của cú pháp đường là chưa có sẵn: "Có String.Join - những gì heck về int []? ".

+2

Tốt hơn theo cách nào? Nhanh hơn? Ít mã hơn? –

+4

Mọi người rất kỳ lạ vào những ngày này. "Nếu không có một chức năng cho một cái gì đó, nó là sai". Bạn có thể nhận được bao nhiêu đơn giản hơn; lặp lại trên mảng, thêm chúng lại với nhau. Yeesh. –

+2

Ngoài ra, LOL ở "mã sạch hơn". Bạn nghĩ gì về Array.Sum của thư viện đang làm khi bạn gọi nó? –

Trả lời

115

Với điều kiện là bạn có thể sử dụng C# 3.5 và LINQ, hãy thử

int sum = arr.Sum(); 
+0

Cảm ơn rất nhiều - tôi cho rằng bạn xứng đáng với điểm đánh dấu trong kết thúc nhịp tim này. Đặc biệt để chỉ ra yêu cầu C# 3.5. – Filburt

+2

@Filburt/@Thomas: sửa đổi nhỏ: đó là C# 3.0. Phiên bản **. NET ** cung cấp phương thức mở rộng 'Sum' là phiên bản 3.5. –

+7

Bản sắc lambda là không cần thiết. Ngoại trừ việc nhầm lẫn anh chàng mới trong đội. – Will

53

Có có. Với .NET 3.5:

int sum = arr.Sum(); 
Console.WriteLine(sum); 

Nếu bạn không sử dụng .NET 3.5 bạn có thể làm điều này:

int sum = 0; 
Array.ForEach(arr, delegate(int i) { sum += i; }); 
Console.WriteLine(sum); 
+8

+1 cho câu trả lời không phải LINQ. –

+1

Tại sao một phiên bản trước 3.5 phức tạp như vậy? Vòng lặp 'foreach' có sẵn trong tất cả các phiên bản của C#. –

+2

@ Jørn: OP yêu cầu một cách tiếp cận ngắn hơn. 'Foreach' chỉ thay thế một dòng mã cho mã khác và không ngắn hơn. Bên cạnh đó một 'foreach' là hoàn toàn tốt đẹp và dễ đọc hơn. –

15

với LINQ:

arr.Sum() 
4

Nó phụ thuộc vào cách bạn xác định tốt hơn . Nếu bạn muốn mã trông sạch hơn, bạn có thể sử dụng .Sum() như được đề cập trong các câu trả lời khác. Nếu bạn muốn các hoạt động để chạy một cách nhanh chóng và bạn có một mảng lớn, bạn có thể làm cho nó song song bằng cách phá vỡ nó thành tổng phụ và sau đó tổng hợp các kết quả.

+0

+1 Điểm rất tốt về cải thiện hiệu suất nhưng thành thật mong muốn ban đầu của tôi là thoát khỏi sự lặp lại. – Filburt

+0

(không ai nói với Fil rằng anh ta chỉ đẩy lùi một vài cấp xuống ngăn xếp) – Will

+0

@Will: Dude - đừng mong tôi tin rằng nếu tôi không viết ma thuật mã sẽ xảy ra ;-) – Filburt

0

Sử dụng foreach sẽ ngắn hơn, nhưng có thể thực hiện chính xác các bước tương tự khi chạy sau khi tối ưu hóa JIT nhận ra so sánh với Độ dài trong biểu thức kiểm soát vòng lặp.

1

Nếu bạn không thích LINQ, tốt hơn là sử dụng vòng lặp foreach để tránh hết chỉ mục.

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

Bạn có thể làm điều này bằng một trong hai cách sau:

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

Hãy thử mã này:

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

Kết quả là:

0

Trong một trong các ứng dụng của tôi, tôi đã sử dụng:

public class ClassBlock 
{ 
    public int[] p; 
    public int Sum 
    { 
     get { int s = 0; Array.ForEach(p, delegate (int i) { s += i; }); return s; } 
    } 
} 
Các vấn đề liên quan