Des moyens rapides pour éviter les doublons dans une Liste<> en C#

Mon programme C# génère des chaînes aléatoires à partir d'un modèle donné. Ces chaînes de caractères sont stockées dans une liste. Comme pas de doublons sont autorisés que je suis en train de faire comme ceci:

List<string> myList = new List<string>();
for (int i = 0; i < total; i++) {
  string random_string = GetRandomString(pattern);
  if (!myList.Contains(random_string)) myList.Add(random_string);
}

Comme vous pouvez l'imaginer cela fonctionne très bien pour plusieurs centaines d'entrées. Mais je suis face à la situation de générer plusieurs millions de chaînes. Et à chaque ajout de la chaîne de contrôle de doublon devient plus lent et plus lent.

Y a des manières plus rapides pour éviter les doublons?

  • l'utilisation de set pour éviter les doublons
  • serait-il plus rapide aussi ajoutez-les tous, puis utiliser Distinct() pour vérifier les doublons, puis ajouter le nombre qui ont été supprimés?
  • Cela sonne comme quelque chose de valeur de test pour un jeu de données particulier. Si elle ne s'avèrent être plus rapide, puis un poids serait que l'optimisation de la performance à l'encontre de l'obscurcissement il ajoute au code (qui n'est pas dans ce cas).
  • Simplement par curiosité, quels sont exactement vous à l'aide de ces pour?
  • J'avais sans doute l'argument théorique qui HashSet<T> serait plus rapide car moins de mémoire impact au départ et ne pas avoir à la parcourir entièrement par la suite. Le coût de la vérification de chaque élément existe toujours, mais que la structure de données est optimisé pour cela.
  • J'ai besoin de ces pour générer des numéros de série pour les documents.
  • Pourriez-vous utiliser un GUID pour chaque document?
  • Si vous êtes à la persistance de votre liste à une base de données, vous pouvez également essayer de rendre le champ unique et puis si l'INSERTION échoue, vous pouvez essayer un autre - juste autre chose à considérer
  • Non, malheureusement. Le modèle est une sorte de spécial afin de Guid ne va pas aider.
  • Faire toute une DB aller-retour juste pour découvrir que la chaîne existe déjà, ce serait... un problème.
  • Dépend de la façon dont il est susceptible de conflit. Si le programme est d'avoir à charger la Liste à partir de la DB, en premier lieu, il pourrait être un compromis acceptable.
  • Ce qui fait que même un seul DB requête pour déterminer si un élément existe déjà dans la base de données prendra plus de temps que des centaines de milliers, voire des millions de vérifications pour voir si un élément existe dans un hashset dans la mémoire. À l'aide d'un DB pour résoudre ce problème pourrait être facilement plusieurs milliers de fois ralentissement.
  • Juste assez, vous êtes probablement correct, il semble logique de toute façon