2009-11-13 3 views
1

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

  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 sur la maintenabilité du code.

Répondre

7

Je m'attendrais à ce que Enumerable.Distinct soit à peu près aussi rapide que l'utilisation d'un dictionnaire si vous le faites une seule fois. Si vous voulez pouvoir ajouter/supprimer des valeurs et conserver la distinction, vous pouvez construire un HashSet<string> (ce qui est essentiellement ce que je pense que Distinct fait sous le capot, mais Distinct() retournera évidemment de nouvelles valeurs comme il les trouve, en maintenant pour

En fait, tout en utilisant:.

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

sera une solution assez bonne (et simple) si vous ne me dérange pas l'ordre d'être foiré Il est plus simple que d'utiliser un Dictionary, et sur le plan conceptuel. nettoyeur aussi (que vous n'avez pas vraiment voulez mapper les clés aux valeurs)

(Comme toujours, je suggérerais de trouver la solution la plus lisible en premier, et de la comparer - si c'est "assez rapide", alors allez-y. Si vous voulez utiliser ceci dans le cadre d'une autre requête, alors Distinct pourrait bien être le moyen le plus lisible. Sinon, je suggérerais HashSet.)

1

Je vous demanderais d'utiliser le profilage ici. Générez une liste avec des éléments d'échantillon, triez-le en disant 1M fois en utilisant les deux méthodes, et mesurez le temps utilisé par chaque méthode.

Si la lisibilité est un problème, créez une méthode GetDistinctItems et y mettez votre code: voilà, code auto-documenté.

2

J'irais personnellement avec la méthode Distinct() fournie par LINQ. C'est beaucoup plus facile à lire et à maintenir. Bien que l'utilisation de LINQ soit plus lente que l'utilisation d'un dictionnaire, la différence sera faible (dans le cas où vous l'avez indiqué) et vous feriez mieux de passer du temps à optimiser les requêtes de base de données ou les appels de service Web.

Questions connexes