Quiero minimizar el tiempo necesario para recuperar un único elemento único de una lista. ¿Cuál es el método más rápido entre Find
, Single
y First
? Tenga en cuenta que la clave de búsqueda es una identificación única.Entre Encontrar, Solo, Primero, ¿cuál es el más rápido?
Respuesta
El más rápido (para un conjunto grande) sería tenerlos codificados contra un Dictionary<TKey,TValue>
y usar eso.
Single
y First
hacen cosas diferentes; Single
siempre itera todo el conjunto, incluso si lo encuentra al principio de la lista, por lo que First
suele ser más rápido que Single
ya que provoca un cortocircuito.
First
será más rápido que Single
, ya que puede terminar tan pronto como se encuentre la coincidencia. Por otro lado, esto significa que no valida que solo un elemento coincide con el predicado.
Find
debe ser tan rápido como First
, pero es menos portátil, ya que solo funcionará en las listas. Si está utilizando LINQ en general, me gustaría probar para adherirme a los operadores LINQ a menos que haya un beneficio definitivo en el uso de una alternativa.
Como Marc dice, si vas a hacer esto regularmente deberías usar un Dictionary<,>
. Usted puede utilizar el operador ToDictionary
hacer esto fácilmente:
var dictionary = list.ToDictionary(x => x.Id);
// Now you can look up by ID really quickly
Obviamente crear el diccionario necesita algún tiempo para empezar, por lo que sólo querría hacer esto si son busca varias veces.
Son métodos diferentes. Find
se define en List<T>
, es casi lo mismo que First
que se define en Enumerable.cs
como un método de extensión en IEnumerable<T>
. Ambos regresarán si se encuentra un artículo acondicionado (no es necesario recorrer toda la colección), por lo que tienen una pequeña diferencia de rendimiento.
Mientras que Single
devuelve el elemento acondicionado, y también garantiza que este artículo es el único que cumple la condición. Por lo tanto, en la mayoría de los casos, Single
es más lento que First
/Find
, ya que necesita recorrer la colección.
Como una adición a las respuestas existentes: List.Find es mucho más rápido que IEnumerable.Primero porque el primero puede operar en la matriz interna de la lista. El último tiene que pasar por la interfaz IList.
- 1. ¿Cuál es el camino más rápido para encontrar la distancia más corta entre dos cartesiano polígonos
- 2. WCF: ¿cuál es el enlace más rápido?
- 3. ¿Cuál es más rápido COALESCE O ISNULL?
- 4. Diferencia entre File.renameTo y Files.move: ¿Cuál es más rápido?
- 5. ¿Cuál es el estilo de CSS más rápido/más eficiente
- 6. ¿Es git con cvs más rápido que cvs solo?
- 7. numpy.max o max? ¿Cuál es más rápido?
- 8. ¿Cuál es más rápido y por qué?
- 9. ¿Cuál es el más rápido en PHP- MySQL o MySQLi?
- 10. Mapa/ArrayList: cuál es más rápido para buscar un elemento
- 11. ¿Cuál es la diferencia entre el enlace primero y reciente?
- 12. ¿Cuál es el protocolo más rápido, ssh o git?
- 13. ¿Cuál es el algoritmo más rápido para encontrar la diferencia mínima entre pares de números en una matriz?
- 14. Cuál es más rápido y más ligero - mysqli & PDO
- 15. ¿Cuál es el analizador XML más rápido en PHP?
- 16. ¿Cuál es el appender más rápido para log4Net?
- 17. array_push() vs. $ array [] = .... ¿Cuál es el más rápido?
- 18. ¿Cuál es el algoritmo más rápido para realizar exponenciación?
- 19. ¿Es + = más rápido que - =?
- 20. count VS seleccionar en LINQ - ¿cuál es más rápido?
- 21. SQL & PHP - ¿Cuál es más rápido mysql_num_rows() o 'select count()'?
- 22. Idiomas interpretados: ¿el nivel más alto es el más rápido?
- 23. accdb vs mdb. ¿Cuál es más rápido/mejor?
- 24. ¿Cuál es el algoritmo de ordenación más rápido para enteros 0-65535?
- 25. ¿Cuál es el método más rápido/más seguro para iterar sobre un HashSet?
- 26. mysql, ifnull vs coalesce, ¿cuál es más rápido?
- 27. SQL: entre y en (que es más rápido)
- 28. C++ Exp vs. Log: ¿Cuál es más rápido?
- 29. ¿Cuál es el algoritmo de clasificación más rápido para una pequeña cantidad de números enteros?
- 30. ¿Qué es más rápido, XPath o Regexp?
@usr es un punto interesante. Si es correcto, ¿no sería más rápido usar 'Find()'? – Coops
@CodeBlend: Tal vez. En realidad, dudo que la diferencia sea significativa, y ambos serán "O (n), terminando cuando encuentren un partido". En general, usaría los métodos LINQ para aumentar la generalidad a menos que pudiera demostrar que la diferencia es significativa. Usar un diccionario definitivamente sería mejor para múltiples búsquedas, por supuesto. –