web-dev-qa-db-fra.com

LINQ Ring: Any () vs Contains () for Huge Collections

Étant donné une énorme collection d'objets, y a-t-il une différence de performances entre les éléments suivants?

Collection.Contains :

myCollection.Contains(myElement)

Enumerable.Any :

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

Contains () est une méthode d'instance et ses performances dépendent largement de la collection elle-même. Par exemple, Contains () sur une liste est O (n), tandis que Contains () sur un HashSet est O (1).

Any () est une méthode d'extension, et passera simplement par la collection, en appliquant le délégué sur chaque objet. Il a donc une complexité de O (n).

Any () est cependant plus flexible car vous pouvez passer un délégué. Contains () ne peut accepter qu'un objet.

128
Etienne de Martel

Cela dépend de la collection. Si vous avez une collection ordonnée, Contains peut effectuer une recherche intelligente (binaire, hachage, arbre b, etc.) tandis qu'avec Any (), vous êtes essentiellement obligé d'énumérer jusqu'à ce que vous la trouviez (en supposant LINQ to Objects)

Notez également que dans votre exemple Any () utilise l'opérateur "==" qui vérifiera l'égalité référentielle tandis que Contains utilisera IEquitable ou la méthode Equals () qui pourrait être remplacée.

12
tster

Je suppose que cela dépend du type de myCollection qui dicte la manière dont Contains() est implémentée. Si un arbre binaire trié par exemple, il pourrait rechercher plus intelligemment. Il peut également prendre en compte le hachage de l'élément. Any() d'autre part énumérera à travers la collection jusqu'à ce que le premier élément qui remplisse la condition soit trouvé. Il n'y a aucune optimisation pour savoir si l'objet avait une méthode de recherche plus intelligente.

4
Jeff Mercado