2013-12-09 68 views
9

我使用的語言是C#。以C#方式遍歷集合中的所有元素的更快捷方式

讓我們有T類型的對象列表,

List<T> collection = new List<T>{.....}; 

說,我們希望走過去收集的各個項目。這可以通過許多方式完成。其中的跟隨兩個:

foreach(var item in collection) 
{ 
    // code goes here 
} 

foreach(T item in collection) 
{ 
    // code goes here 
} 

是否第二種方法比第與否,爲什麼好?

預先感謝您的回答。

+14

'完全一樣' –

+7

運行時沒有'var'這樣的東西。這兩個將發出相同的編譯代碼。 – David

+0

'var'只是一個不必寫出類型的好方法。編譯器會將var替換爲實際的類型,所以它對最終結果沒有影響。 – Tobberoth

回答

24

它們都完全一樣。 var是方便的語法糖。對於List的遍歷速度沒有任何影響。

我遵循的經驗法則var只有當對象的類型出現在賦值的右側時才使用它,所以在這種情況下,我寧願明確指定類型foreach使其他工程師更清晰,但這取決於個人選擇。如果將鼠標懸停在Visual Studio中的var上,它將顯示類型(假設它可以推斷出應該是什麼)。

+2

Chris是正確的,var的使用對速度沒有任何影響 - 兩個循環在編譯時都會被翻譯成相同的字節碼。 –

+3

有時'var'不僅僅是一個'語法糖',而是一個必須。例如當您遍歷匿名對象列表時。 – haim770

+0

@ haim770事實上,這是匿名類型的必須 - 謝謝! –

8

引述MSDN:

一個隱式類型的局部變量是強類型的,就好像你 了自己聲明的類型,但是編譯器確定的類型。

所以

var i = 10; // implicitly typed 
int i = 10; //explicitly typed 

是完全一樣的。

現在,爲了'更好' - 它將很大程度上取決於你的參數來判斷。如果速度很快,那麼for循環可能比foreach更好,並且T[]優於List<T>,according to Patrick Smacchia。要點:上表

  • for循環是有點比上表foreach循環便宜的2倍以上。
  • 在陣列上循環比在列表上循環便宜2倍左右。
  • 因此,使用for的數組上循環比使用foreach(我相信這是我們所做的)在List上循環便宜5倍。

引用來源:In .NET, which loop runs faster, 'for' or 'foreach'?

參考:http://msdn.microsoft.com/en-us/library/bb383973.aspx

1

有通過同一個集合迭代沒有更快的方法。

無論你使用什麼,你自己的循環或擴展方法 - 這都是一樣的。當你使用var - 它仍然編譯爲相同的東西。

唯一的區別可能是如果您使用字典,它將在搜索值方面比List<T>Collection更快。字典的設計與搜索優化

3

如果你比較IL代碼,那麼你會看到,真的是100%相同。 var只是語法糖:

C#代碼:

List<int> collection = new List<int>(); 
    collection.Add(1); 
    collection.Add(2); 
    collection.Add(3); 

    foreach (var myInt in collection) 
    { 
    Console.WriteLine(myInt); 
    } 

    foreach (var T in collection) 
    { 
    Console.WriteLine(T); 
    } 

bool flag; 

      System.Collections.Generic.List<int> list = new System.Collections.Generic.List<int>(); 
      list.Add(1); 
      list.Add(2); 
      list.Add(3); 
      System.Collections.Generic.List<int>.Enumerator enumerator = list.GetEnumerator(); 
      try 
      { 
       while (flag) 
       { 
        int i1 = enumerator.get_Current(); 
        System.Console.WriteLine(i1); 
        flag = enumerator.MoveNext(); 
       } 
      } 
      finally 
      { 
       enumerator.Dispose(); 
      } 
      enumerator = list.GetEnumerator(); 
      try 
      { 
       while (flag) 
       { 
        int i2 = enumerator.get_Current(); 
        System.Console.WriteLine(i2); 
        flag = enumerator.MoveNext(); 
       } 
      } 
      finally 
      { 
       enumerator.Dispose(); 
      } 
0

1路(含變種)可能是更好的可讀性。 考慮一下:

List<User> list = new List<User>(); 
var users = list.GroupBy(x => x.Name).OrderBy(x => x.Key); 
foreach (var user in users) 
{ 
//blah 
} 

VS

foreach (System.Linq.IGrouping<string, User> user in users) 
{ 
} 

我相信這是在第一個地方有變種的主要原因。

+1

這是*「更好的可讀性」*的一個很不好的例子。考慮到它使用完全命名空間類型+它是一個組,用戶名是'user'。我認爲這是使用'var'關鍵字的理想*候選者。 – James

+0

@James Ups ..我的意思是第一種方式。 – Evgeni

+0

我必須同意@詹姆斯對此。這兩個塊不相等。可讀性和美觀一樣,也是旁觀者的眼睛;第一塊的前三行有助於理解比第二塊更多的內容。 – OnoSendai