tips query optimize how c# linq performance benchmarking

c# - query - Anillo LINQ: Any() versus Contains() para enormes colecciones



how to optimize linq query (3)

Contiene () es un método de instancia, y su rendimiento depende en gran medida de la colección en sí. Por ejemplo, Contains () en una lista es O (n), mientras que Contains () en un HashSet es O (1).

Any () es un método de extensión, y simplemente irá a través de la colección, aplicando el delegado en cada objeto. Por lo tanto, tiene una complejidad de O (n).

Any () es más flexible, sin embargo, ya que puede pasar un delegado. Contiene () solo puede aceptar un objeto.

Dada una gran colección de objetos, ¿hay alguna diferencia de rendimiento entre los siguientes?

Collection.Contains :

myCollection.Contains(myElement)

Enumerable.Any :

myCollection.Any(currentElement => currentElement == myElement)


Depende de la colección. Si tiene una colección ordenada, entonces Contiene podría hacer una búsqueda inteligente (binario, hash, b-tree, etc.) mientras que con Any () básicamente se quedará atrapado en la enumeración hasta que la encuentre (asumiendo LINQ to Objects)

También tenga en cuenta que en su ejemplo Any () está utilizando el operador "==" que comprobará la igualdad referencial, mientras que Contiene utilizará el método IEquitable o Equals () que podría ser anulado.


Supongo que eso dependerá del tipo de myCollection que dicte cómo se implementa Contains() . Si un árbol binario ordenado, por ejemplo, podría buscar más inteligente. También puede tener en cuenta el hash del elemento. Any() por otro lado enumerará a través de la colección hasta que se encuentre el primer elemento que satisfaga la condición. No hay optimizaciones para si el objeto tenía un método de búsqueda más inteligente.