Desidero ridurre al minimo il tempo necessario per recuperare un singolo elemento univoco da un elenco. Qual è il metodo più veloce tra Find
, Single
e First
? Si noti che la chiave di ricerca è un ID univoco.Tra Trova, Singolo, Primo, quale è il più veloce?
risposta
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.
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.
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.
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.
- 1. Quale è più veloce, "trova -exec" o "trova | xargs -0 '?
- 2. Quale è più veloce? Confronto o assegnazione?
- 3. Quale è più veloce, XPath o Regexp?
- 4. Quale è più veloce - INSTR o LIKE?
- 5. Quale è più veloce e perché?
- 6. Trova il primo genitore scrollabile
- 7. Quale è il protocollo più veloce, ssh o git?
- 8. accdb vs mdb. Quale è più veloce/migliore?
- 9. più veloce?
- 10. SQLite Android: quale query ("query" o "rawQuery") è più veloce?
- 11. Map/ArrayList: quale è più veloce per cercare un elemento
- 12. Quale è più veloce, Clojure o ClojureScript (e perché)?
- 13. Quale metodo mysql è veloce?
- 14. unordered_map: quale è più veloce find() o count()?
- 15. Differenza tra File.renameTo e Files.move: Qual è più veloce?
- 16. Quale è più veloce asp.net mvc json o json.net?
- 17. Quale costrutto "se" è più veloce - istruzione o operatore ternario?
- 18. Quale è più veloce? Costanti, variabili o array di variabili
- 19. Confronto Regex vs. Manuale. Quale è più veloce?
- 20. JQuery - Trova il primo selettore di corrispondenze tra parentesi
- 21. Quale è più veloce tra la memorizzazione delle immagini in Mongo GridFS o Amazon S3?
- 22. WCF - qual è il legame più veloce?
- 23. Qual è il parser XML più veloce in PHP?
- 24. Trova il primo zero nell'array in matlab
- 25. SQL: TRA e IN (che è più veloce)
- 26. Il modo più veloce per comunicare tra C++ e C#
- 27. È HttpWebRequest o Webclient più veloce
- 28. numpy.max o max? Qual è più veloce?
- 29. Tutto uguale a quale è il modo più veloce per inviare dati su disco in C++?
- 30. Quale è più veloce/migliore per la memorizzazione nella cache, il file system o Memcached?
@usr rende un punto interessante. Se è corretto, non sarebbe più veloce usare 'Trova()'? – Coops
@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. –