2009-10-12 3 views
2

normalement avec un Hashtable je fais:vérifier si la liste <MyObject> est déjà dans la collection

if(!myHash.Contains(someId)) 
{ 
    // insert to hash 
} 

Si j'ai une liste, comment puis-je vérifier l'utilisation contient?

En ce moment je crée juste une hashtable des identifiants d'utilisateur, et vérifie cela, mais est-ce qu'il y a juste une manière d'employer juste la liste?

Répondre

7

Vous pouvez utiliser List<T>.Contains - soyez conscient qu'il s'agira d'une recherche linéaire, c'est-à-dire O (N) au lieu de O (1) d'un HashMap. Si votre liste n'est pas trop grande, il est peu probable que cela pose un gros problème. Bien sûr, vous avez toujours besoin des éléments pour remplacer correctement Equals, sauf si vous êtes satisfait de l'identité de référence.

Si vous avez une grande liste sur laquelle vous devrez effectuer des tests de confinement répétés, vous pouvez simplement créer un HashSet<T> à partir de la liste existante. Si vous devez manipuler la liste au fur et à mesure, vous pouvez encapsuler la liste et l'ensemble dans votre propre collection. Vous aurez besoin de déterminer la sémantique que vous voulez - que voudriez-vous arriver si vous avez ajouté le même ID deux fois? Le deuxième appel devrait-il être ignoré? Si vous pouvez vous en sortir sans le faire, tant mieux :)

4

Existe-t-il une raison pour laquelle List.Contains ne fonctionne pas?

if (!myList.Contains(someId)) { 
    ... 
} 

Si l'ID est une propriété sur MyObject alors vous pouvez effectuer les opérations suivantes

if (!myList.Any(x => x.Id == someId)) { 
    ... 
} 
1

Vous pouvez utiliser la méthode List.Contains. Cependant, notez que cette méthode effectue une recherche linéaire et est donc plus lente qu'une Hashtable. Si vous avez un grand nombre d'utilisateurs, pensez à utiliser un HashSet.

1

Vous pouvez également faire

list.Find(x => x.Id == someOtherValue) != null 

au cas où vous besoin d'un soutien en C# 2.0, il peut être écrit comme ceci

list.Find(delegate(Agent x) { return x.Id == someOtherValue; }) != null 

Pour LINQ, il pourrait également être fait avec

bool listContainsId = (from item in list 
          where item.Id == someOtherValue 
          select item).Any(); 
+0

woohoo pour Linq! – Gabe

+0

En fait, cela n'utilise pas LINQ, mais utilise simplement l'opérateur lambda pour créer une méthode déléguée en ligne. L'exemple de JaredPar utilisant la méthode .Any est LINQ. –

Questions connexes