2010-03-10 77 views
64

有沒有更好的 比迭代數組更短?如何總結一個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 []? 」。

+2

以何種方式更好?更快?少寫代碼? – 2010-03-10 18:13:38

+4

這幾天人們都很奇怪。 「如果還沒有某個功能,那就錯了」。你能得到多少簡單;迭代數組,將它們添加到一起。 Yeesh。 – 2010-03-10 18:30:10

+2

另外,LOL在「更乾淨的代碼」。當你打電話給庫時,你認爲圖書館的Array.Sum正在做什麼? – 2010-03-10 18:30:44

回答

115

前提是你可以使用C#3.5和LINQ,嘗試

int sum = arr.Sum(); 
+0

非常感謝 - 我認爲你值得在這個心跳完成標記。特別是指出C#3.5的要求。 – Filburt 2010-03-10 18:16:17

+2

@Filburt/@Thomas:一個小小的更正:它是C#3.0。提供'Sum'擴展方法的** .NET **版本是3.5版本。 – 2010-03-10 18:20:38

+7

標識lambda不是必需的。除了混淆團隊中的新人。 – Will 2010-03-10 18:23:27

53

是的,有。在.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); 
+8

對於非LINQ答案+1。 – 2010-03-10 18:12:46

+1

爲什麼這麼複雜的3.5版本? 'foreach'循環在所有版本的C#中都可用。 – 2010-03-16 09:37:08

+2

@Jørn:OP要求採用更短的方法。一個'foreach'只是用一行代碼代替另一行代碼,而不是更短。除此之外,'foreach'完全正確,更具可讀性。 – 2010-03-16 11:34:37

15

與LINQ:

arr.Sum() 
4

這取決於你如何定義更好。如果您希望代碼看起來更乾淨,則可以使用.Sum(),如其他答案中所述。如果您希望操作快速運行並且您有一個大數組,您可以通過將其拆分爲小數,然後對結果進行求和來使其平行。

+0

+1在性能改進方面非常好的一點,但老實說,我最初的願望是擺脫迭代。 – Filburt 2010-03-10 18:21:10

+0

(沒有人告訴菲爾,他只是將迭代推向棧的幾個級別) – Will 2010-03-10 18:24:09

+0

@Will:Dude--不要指望我相信如果我不寫代碼魔法會發生;-) – Filburt 2010-03-10 18:27:08

0

使用foreach會更短的代碼,但在JIT優化識別for-loop控件表達式中的長度比較之後,運行時可能會在運行時執行完全相同的步驟。

1

如果你不喜歡LINQ,最好使用foreach循環來避免出現索引。

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

您可以通過的方式做到這一點:

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

試試這個代碼:

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

結果是:

0

在我的應用程序之一,我用:

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