91 votes

Liste efficace de chaînes de caractères uniques C#

Quel est le moyen le plus efficace de stocker une liste de chaînes de caractères en ignorant les doublons ? Je pensais qu'un dictionnaire pourrait être la meilleure solution pour insérer des chaînes de caractères en écrivant dict[str] = false ; et en énumérant les clés sous forme de liste. Est-ce une bonne solution ?

114voto

JP Alioto Points 33482

Si vous utilisez .NET 3.5, la fonction HashSet devrait fonctionner pour vous.

La classe HashSet<(Of <(T>)>) fournit des opérations sur les ensembles très performantes. Un ensemble est une collection qui ne contient aucun éléments en double, et dont les éléments ne sont pas dans un ordre particulier.

8 votes

Mais un HashSet perdra l'ordre des éléments. Une fonction a List fournit.

5 votes

Supplémentaire : Il existe également SortedSet<T> qui est un HashSet trié pratique.

0 votes

Notez également que l'on ne peut pas accéder à HashSet par l'indice, mais uniquement par un énumérateur, contrairement à une liste.

26voto

Perpetualcoder Points 7381

Vous pouvez chercher à faire quelque chose comme ceci

var hash = new HashSet<string>();
var collectionWithDup = new []{"one","one","two","one","two","zero"}; 

// No need to check for duplicates as the Add method
// will only add it if it doesn't exist already
foreach (var str in collectionWithDup)
    hash.Add(str);

33 votes

Vous n'avez pas besoin de la vérification Contains avec un HashSet. Vous pouvez simplement appeler la méthode Add directement et elle renverra true ou false selon que l'élément existe déjà ou non.

1 votes

La réponse devrait être modifiée pour supprimer l'appel à des Containers redondants. Voici tout ce dont vous avez besoin pour que l'exemple ci-dessus fonctionne : var collectionWithDup = new[] { "one", "one", "two", "one", "two", "zero" } ; var uniqueValues = new HashSet<string>(collectionWithDup) ;

14voto

scone Points 134

Je ne sais pas si cela compte comme une bonne réponse, mais lorsque j'ai été confronté au besoin d'un ensemble unique qui maintient l'ordre d'insertion, j'ai fait un compromis avec un HashSet et une liste côte à côte. Dans ce cas, chaque fois que vous ajoutez à l'ensemble, faites ce qui suit :

if(hashSet.Add(item))
    orderList.Add(item);

Lorsque vous retirez des éléments, veillez à les retirer des deux. Ainsi, tant que vous pouvez être sûr que personne d'autre n'a ajouté d'éléments à la liste, vous aurez un ensemble unique ordonné par insertion !

8voto

Priyang Points 61

Utilisez HashSet, pas besoin de vérifier .Contains(), ajoutez simplement vos éléments dans la liste et si c'est un doublon, il ne l'ajoutera pas.

   HashSet<int> uniqueList = new HashSet<int>();
   uniqueList.Add(1); // List has values 1
   uniqueList.Add(2);  // List has values 1,2
   uniqueList.Add(1);  // List has values 1,2
   Console.WriteLine(uniqueList.Count); // it will return 2

2voto

AndrewB Points 576

Cela ne fait pas partie de l'espace de noms du système, mais j'ai utilisé l'espace de noms Iesi.Collections de la base de données de l'entreprise. http://www.codeproject.com/KB/recipes/sets.aspx avec NHibernate. Il prend en charge les ensembles hachés ainsi que les ensembles triés, les ensembles de dictionnaires, etc. Depuis qu'il a été utilisé avec NHibernate, il a été largement utilisé et est très stable. Il ne nécessite pas non plus .Net 3.5.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X