2011-01-27 9 views

risposta

28

Il più veloce (per un set di grandi dimensioni) sarebbe quello di averli collegati a uno Dictionary<TKey,TValue> e utilizzarlo.

Single e First fare cose diverse; Single esegue sempre l'iterazione dell'intero set, anche se lo trova all'inizio dell'elenco, quindi First di solito è più veloce di Single poiché si verifica un cortocircuito.

23

First sarà più veloce di Single, perché può terminare non appena viene trovata la corrispondenza. D'altra parte, questo significa che lo non corrisponde a e convalida che solo un elemento corrisponde al predicato.

Find dovrebbe essere veloce come First, ma è meno portatile in quanto funziona solo sugli elenchi. Se stai usando LINQ in generale, vorrei provare per attenersi agli operatori LINQ a meno che non ci sia un vantaggio decisivo nell'utilizzo di un'alternativa.

Come dice Marc, se hai intenzione di farlo regolarmente dovresti usare uno Dictionary<,>. È possibile utilizzare l'operatore ToDictionary di farlo facilmente:

var dictionary = list.ToDictionary(x => x.Id); 
// Now you can look up by ID really quickly 

Ovviamente la creazione del dizionario richiede un certo tempo per iniziare, in modo che ci vogliono solo fare questo se si sono ricerca più volte.

+0

@usr rende un punto interessante. Se è corretto, non sarebbe più veloce usare 'Trova()'? – Coops

+1

@CodeBlend: Forse. In realtà, dubito che la differenza sarebbe significativa, e sarebbero entrambi "O (n), finendo quando hanno trovato una corrispondenza". Generalmente utilizzerei i metodi LINQ per aumentare la generalità a meno che non riesca a dimostrare che la differenza è significativa. Usare un dizionario sarebbe sicuramente meglio per le ricerche multiple, ovviamente. –

2

Sono metodi diversi. Find è definito in List<T>, è quasi lo stesso di First definito in Enumerable.cs come metodo di estensione su IEnumerable<T>. Entrambi restituiranno se viene trovato un oggetto condizionato (non è necessario scorrere l'intera raccolta), quindi presentano una leggera differenza di prestazioni.

Mentre Single restituisce l'articolo condizionato e garantisce anche che questo articolo sia l'unico che soddisfa la condizione. Pertanto, nella maggior parte delle circostanze, Single è più lento di First/Find perché è necessario eseguire il ciclo della raccolta.

1

In aggiunta alle risposte esistenti: List.Find è molto più veloce di IEnumerable.Primo perché il primo può operare sulla matrice interna dell'elenco. Quest'ultimo deve passare attraverso l'interfaccia IList.

Problemi correlati