Quelle est la façon la plus efficace de créer une liste distincte des éléments en utilisant .NET?

StackOverflow https://stackoverflow.com/questions/1727894

Question

J'ai une grande liste de valeurs (100-200 chaînes de caractères) et je dois retourner une liste distincte d'entre eux. Quelle est la façon la plus efficace de le faire en utilisant .NET? Les 2 façons que je peux penser sont:

  1. Utilisez la méthode Distinct () de la classe IEnumerable
  2. Utilisez un dictionnaire

Si l'approche dictionnaire est plus rapide en termes bruts, envisager une décision de compromis autour maintenabilité du code.

Était-ce utile?

La solution

Je me attends Enumerable.Distinct d'être à peu près aussi vite que l'aide d'un dictionnaire si vous faites seulement une fois. Si vous voulez être en mesure d'ajouter / supprimer des valeurs et de garder la ness distincte, vous pouvez construire une HashSet<string> (qui est essentiellement ce que je pense Distinct fait sous le capot, mais Distinct() retournerez évidemment de nouvelles valeurs comme il les trouve, le maintien ordre.

En fait, juste en utilisant:

HashSet<string> distinctItems = new HashSet<string>(list);

sera une solution si vous ne me dérange pas assez bon (et simple) la commande étant foiré. Il est plus simple que d'utiliser un Dictionary et conceptuellement plus propre aussi bien (comme vous le faites pas vraiment voulez mapper les touches aux valeurs).

(Comme toujours, je suggère de trouver la solution la plus facile à lire d'abord, et le benchmark -. Si vous voulez utiliser dans le cadre d'une autre requête si elle est « assez vite », puis aller avec cela, alors Distinct pourrait bien être la manière la plus lisible. Sinon, je vous suggère de HashSet.)

Autres conseils

Je voudrais aller personnellement avec la méthode Distinct () fournies par LINQ. Il est beaucoup plus facile à lire et à maintenir. Tout en utilisant LINQ sera plus lent que d'utiliser un dictionnaire la différence sera faible (dans le cas où vous avez mis en vente) et que vous feriez mieux des requêtes ou des appels de service Web de base de données en optimisant le temps de dépenses.

Je vous siggest d'utiliser le profilage ici. Générer une liste avec des exemples d'items, trier dire fois 1M en utilisant les deux sens, et de mesurer le temps utilisé par trajet.

Si la lisibilité est un problème, créez une méthode de GetDistinctItems et de mettre votre code à l'intérieur. Voilà, le code auto-documenté

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top