2012-01-01 13 views
5

Grazie per l'aiuto spiegandomi su IList e IEnumerable. Ho contrassegnato come question come risposta. Ora ho una richiesta per un po 'più di informazioni.Metodo di conteggio o proprietà per un IList

Ho codice in questo modo:

for (var index = 0; index < Model.Items.Count(); index++) 

È stato suggerito in un precedente post che non è efficiente come il Conte() è un metodo ed Viene eseguito molte volte. Ho provato quanto segue:

for (var index = 0; index < Model.Items.Count; index++) 

Questo sembra funzionare.

Qualcuno può confermare che c'è una differenza. Entrambi funzionano così non sono sicuro al 100%.

Il seguente sarebbe il più efficiente? Il foreach ha bisogno di un IList o IEnumerable?

foreach(var item in Items) 
+0

prega di inserire link al tuo precedente interrogazione –

+0

aggiunto la questione prervious – rene

risposta

4

La chiamata Count() metodo effettivamente chiama il metodo statico Enumerable.Count(). Questo è ottimizzato per le implementazioni IList per l'utilizzo della proprietà, ma ciò richiede un controllo dinamico dei tipi e comunque finisce per passare alla proprietà, quindi l'utilizzo della proprietà è sicuramente più efficiente. In .NET 3.5 si ottimizza solo per ICollection<T>, mentre in .NET 4 si ottimizza anche per il non generico ICollection. Vedi my Edulinq blog post on Count per maggiori dettagli.

Per quanto riguarda l'ultimo pezzo della tua domanda: un loop foreach può o non può essere più efficiente, ma sarebbe più leggibile a mio avviso, che è un po 'più importante. Definitivamente userò foreach a meno che non si abbia davvero bisogno dell'indice di ogni voce.

+0

Grazie Jon. Il foreach richiede un IList o IEnumerable? –

+0

@ Samantha2: In realtà non richiede nè, strettamente parlando, ma 'IEnumerable' (o' IEnumerable ') sono sufficienti per garantire che sia possibile utilizzare' foreach'. –

6

Count() metodo di estensione funziona per tutti gli oggetti che supportano IEnumerable, e dal momento che IEnumerable sé non ha alcun mezzo di segnalazione conteggio degli elementi, è può avere a iterare IEnumerable esempio usando il suo IEnumerator, che può essere un vero e proprio calo di prestazioni se chiamato più volte.

Tuttavia, se si guarda in Count() implementazione, vedrai che è ottimizzato per ICollection tipi (sia generici e non generici, almeno in FW4.0, che significa IList e IList<T> sono ottimizzati), e se il tuo oggetto implementa ICollection (che riporta l'elemento conteggio nella proprietà Count), il metodo Count() restituisce il conteggio degli articoli senza iterare attraverso la raccolta. Ecco perché non vedi la differenza di prestazioni. Tuttavia, se sai di avere l'istanza ICollection o IList, perché non ottenere la proprietà Count direttamente ed essere indipendente dall'implementazione del metodo Count()?

Inoltre, ricorda che è possibile memorizzare nella cache valore di ritorno di Count() metodo in una variabile di sopprimere più chiamate:

var count = Model.Items.Count(); 
for(var index = 0; index < count; index++) { } 
Problemi correlati