2013-12-09 10 views
9

La lingua che uso è C#.modo più veloce tra le modalità di iterazione di tutti gli elementi di una raccolta in C#

Let abbiamo un elenco di oggetti di tipo T,

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

dire che vogliamo andare oltre ogni elemento della collezione. Questo può essere fatto in molti modi. Tra di loro, sono i seguenti due:

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

e

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

Ha la seconda strada sia migliore della prima o no, e perché?

Grazie in anticipo per le vostre risposte.

+14

'esattamente lo stesso' –

+7

Non esiste una cosa come' var' in fase di esecuzione. I due emetteranno un codice compilato identico. – David

+0

'var' è solo un bel modo per non dover scrivere i tipi. Il compilatore sostituirà var con il tipo effettivo, quindi fa la differenza zero al risultato finale. – Tobberoth

risposta

24

Sono entrambi esattamente uguali. var è zucchero sintattico per comodità. Non fa differenza per la velocità con cui è attraversato un .

La regola generale che seguo con var deve essere utilizzata solo se il tipo di oggetto è presente sul lato destro di un compito, quindi in questo caso preferirei specificare esplicitamente il tipo nel foreach per rendere più chiaro per gli altri ingegneri, ma è una scelta personale. Se si passa con il mouse su un var in Visual Studio, verrà visualizzato il tipo (presupponendo che possa inferire ciò che dovrebbe essere).

+2

Chris è corretto, l'uso di var non fa assolutamente differenza per velocità - entrambi i loop verranno tradotti in bytecode identico una volta compilati. –

+3

A volte 'var' non è solo uno 'zucchero sintattico' ma un must. per esempio quando si itera su un elenco di oggetti anonimi. – haim770

+0

@ haim770 In effetti, è un must per i tipi anonimi - grazie! –

8

Citando MSDN:

Un implicitamente tipizzato variabile locale è fortemente tipizzato come se si aveva dichiarato il tipo da soli, ma il compilatore determina il tipo.

Così

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

sono esattamente gli stessi.

Ora, per "meglio" - Dipenderà pesantemente da quale parametro si giudica. Se è la velocità, un ciclo for può essere migliore di uno foreach e T[] migliore di List<T>, according to Patrick Smacchia. Punti principali:

  • for Asole su List sono un po 'più di 2 volte in meno rispetto foreach loop su List.
  • Il ciclo su array è circa 2 volte più economico rispetto al ciclo su Elenco.
  • Di conseguenza, il ciclo su array usando for è 5 volte più economico di un loop su List utilizzando foreach (che credo sia quello che facciamo tutti).

fonte Citazione: In .NET, which loop runs faster, 'for' or 'foreach'?

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

1

Non c'è modo più veloce per scorrere stessa collezione.

Indipendentemente da ciò che si utilizza, i propri metodi di loop o di estensione - questo è lo stesso. Quando si utilizza var, si compila ancora per la stessa cosa.

L'unica differenza potrebbe essere che se si utilizza Dizionario, sarà più veloce dello List<T> o Collection in termini di ricerca di valori. Il dizionario è stato progettato con l'ottimizzazione per la ricerca

3

Se si confronta il codice IL, si vedrà che il 100% è lo stesso. var è solo zucchero sintattico:

C# Codice:

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

primo modo (con var) potrebbe essere migliore per migliorare la leggibilità. Considerate questo:

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

Credo che è stata la ragione principale per avere var in primo luogo.

+1

Questo è un pessimo esempio di * "migliore leggibilità" *. Considerando che sta usando un tipo con un namespace completo + è un gruppo e il nome utente è 'utente'. Direi che questo è un candidato * ideale * per usare la parola chiave 'var'. – James

+0

@James Ups .. Intendevo il 1o modo. – Evgeni

+0

Devo concordare con @James su questo. I due blocchi non sono uguali. E la leggibilità, come la bellezza, è anche negli occhi di chi guarda; Le prime tre righe del primo blocco aiutano a capire molto più del secondo blocco. – OnoSendai

Problemi correlati