2013-12-09 6 views
9

Używany przeze mnie język to C#.szybsza droga między sposobami iteracji przez wszystkie elementy kolekcji w języku C#

Let mamy listę obiektów typu T,

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

Powiedzmy, że chcemy iść na każdego elementu kolekcji. Można to zrobić na wiele sposobów. Wśród nich są następujące dwa:

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

i

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

Czy drugi sposób jest lepszy niż pierwszy, czy nie i dlaczego?

Z góry dziękuję za odpowiedzi.

+14

'dokładnie to samo' –

+7

Nie ma czegoś takiego jak" var "w czasie wykonywania. Obie będą emitować identyczny skompilowany kod. – David

+0

'var' jest po prostu fajnym sposobem, aby nie pisać typów. Kompilator zastąpi zmiennik var z faktycznym typem, więc nie ma żadnego wpływu na końcowy wynik. – Tobberoth

Odpowiedz

24

Obie są dokładnie takie same. var to cukier syntaktyczny dla wygody. Nie ma wpływu na prędkość, z jaką wykonywany jest ruch List.

Reguła, którą podążam za pomocą var, należy używać tylko wtedy, gdy typ obiektu znajduje się po prawej stronie zlecenia, więc w tym przypadku wolałbym wyraźnie określić typ w foreach, aby uczynić go bardziej zrozumiałym dla innych inżynierów, ale zależy to od osobistego wyboru. Jeśli umieścisz kursor myszy nad ikoną var w programie Visual Studio, wyświetli typ (zakładając, że może wywnioskować, co powinno być).

+2

Chris ma rację, użycie var zdecydowanie nie ma znaczenia dla prędkości - obie pętle zostaną przetłumaczone na identyczny kod bajtowy podczas kompilacji. –

+3

Czasami 'var' nie jest tylko" cukrem syntaktycznym ", ale koniecznością. na przykład podczas iteracji na liście anonimowych obiektów. – haim770

+0

@ haim770 Rzeczywiście, to musi dla anonimowych typów - dzięki! –

8

Cytowanie MSDN:

niejawnie wpisywanych zmiennej lokalnej jest silnie wpisane tak samo jeśli oświadczył typu siebie, ale kompilator określa typ.

Więc

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

są dokładnie takie same.

Teraz, dla "lepszego" - to będzie zależeć od tego, jaki jest twój parametr, aby to ocenić. Jeśli jest to szybkość, to pętla for może być lepsza niż foreach ilepsza niż List<T>, . Główne punkty:

  • for pętle na liście są nieco więcej niż 2 razy tańsze niż foreach pętle na liście.
  • Zapętlanie na tablicy jest około 2 razy tańsze niż zapętlanie na liście.
  • W związku z tym zapętlanie tablic za pomocą for jest 5 razy tańsze niż zapętlenie na liście przy użyciu foreach (co, jak sądzę, jest wszystkim, co robimy).

Cytat źródło: In .NET, which loop runs faster, 'for' or 'foreach'?

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

1

Nie ma szybszy sposób iterację samej kolekcji.

Bez względu na to, czego używasz, własne metody tworzenia pętli lub rozszerzenia - to wszystko jest takie samo. Podczas korzystania z var - nadal kompiluje się do tego samego.

Jedyną różnicą może być to, że jeśli korzystasz ze Słownika, będzie on szybszy niż List<T> lub Collection pod względem wyszukiwania wartości. Słownik został zaprojektowany z optymalizacją dla wyszukiwania

3

Jeśli porównasz kod IL, zobaczysz, że w rzeczywistości są w 100% takie same. var jest tylko cukier syntaktyczny:

C# Kod:

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-ty sposób (z var) może być lepiej dla czytelności. Rozważ to:

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

wierzę, że było głównym powodem, dla którego var w pierwszej kolejności.

+1

To jest całkiem zły przykład * "lepszej czytelności" *. Biorąc pod uwagę, że używa on typu o pełnym identyfikatorze + to jest grupa, a nazwa użytkownika to 'user'. Twierdzę, że jest to * idealny * kandydat do użycia słowa kluczowego 'var'. – James

+0

@ James Ups .. Miałem na myśli 1 sposób. – Evgeni

+0

Muszę się zgodzić z @James na ten temat. Te dwa bloki nie są równe. A czytelność, podobnie jak piękno, jest również na oku patrzącego; Pierwsze trzy linie pierwszego bloku pomagają zrozumieć znacznie więcej niż drugi blok. – OnoSendai

Powiązane problemy