2011-01-27 14 views

Respuesta

28

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.

23

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.

+0

@usr es un punto interesante. Si es correcto, ¿no sería más rápido usar 'Find()'? – Coops

+1

@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. –

2

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.

1

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.

Cuestiones relacionadas