Comment tester si une table de hachage C # contient une paire clé / valeur spécifique?

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

  •  20-08-2019
  •  | 
  •  

Question

Je stocke un ensemble d'ID d'élément supposément uniques en tant que clé et les emplacements de fichier en tant que valeur dans une table de hachage lors du parcours d'une table. En cours de route, je dois m'assurer que la paire clé / emplacement est unique ou émettre un message d'erreur. J'ai configuré la table de hachage et je charge les valeurs, mais je ne sais pas quoi tester:

Hashtable check_for_duplicates = new HashTable();
foreach (object item in items)
{
    if (check_for_duplicates.ContainsKey(item["ItemID"]) &&
        //what goes here?  Would be contains item["Path"] as the value for the key)
    {
        //throw error
    }
}
Était-ce utile?

La solution

Essayez ceci:

Hashtable check_for_duplicates = new HashTable();
foreach (object item in items)
{
    if (check_for_duplicates.ContainsKey(item["ItemID"]) &&
        check_for_duplicates[item["ItemID"]].Equals(item["Path"]))
    {
        //throw error
    }
}

De même, si vous utilisez .NET 2.0 ou une version ultérieure, envisagez d'utiliser des génériques, comme ceci:

List<Item> items; // Filled somewhere else

// Filters out duplicates, but won't throw an error like you want.
HashSet<Item> dupeCheck = new HashSet<Item>(items); 

items = dupeCheck.ToList();

En fait, je viens de vérifier, et il semble que HashSet est uniquement .NET 3.5. Un dictionnaire serait plus approprié pour la version 2.0:

Dictionary<int, string> dupeCheck = new Dictionary<int, string>();

foreach(Item item in items) {
    if(dupeCheck.ContainsKey(item.ItemID) && 
       dupeCheck[item.ItemID].Equals(item.Path)) {
        // throw error
    }
    else {
        dupeCheck[item.ItemID] = item.Path;
    }    
}

Autres conseils

Si vous utilisiez Dictionary à la place, la méthode TryGetValue vous aiderait. Je ne pense pas qu’il existe un moyen vraiment meilleur pour la classe assez obsolète Hashtable.

object value;
if (dic.TryGetValue("key", out value) && value == thisValue)
  // found duplicate
if (check_for_duplicates.ContainsKey(item["ItemID"]) &&
    check_for_duplicates[item["ItemID"]] == item["Path"])
{
    //throw error
}

ContainsKey est la meilleure méthode.

Si vous n'êtes pas obligé d'utiliser .NET 1.1, j'utiliserais le dictionnaire introduit dans .NET 2.0.

Il est bien meilleur qu’une table de hachage de performance et est fortement typé.

Dictionary<string, int> betterThanAHash = new Dictionary<string, int>();

betterThanAHash.ContainsKey("MyKey");

Pourquoi ne pas utiliser un Dictionary à la place?

Cela lève une exception ArgumentException si vous essayez de Add une clé qui existe déjà dans check_for_duplicates.

De cette façon, vous pouvez récupérer le duplicata au moment de son ajout, plutôt que d'effectuer un <=> test plus tard.

Hashtable check_for_duplicates = new HashTable();

foreach (object item in items) 
{
    if (check_for_duplicates.ContainsKey(item["ItemID"]) && check_for_duplicates[item["ItemID"]] == item["Path"])
    {
        //throw error
    } 
}

Je crois que c'est ce que vous recherchez.

EDIT - On dirait que j'ai été battu au poinçon: P

Cela dépend en quelque sorte de ce que le tableau d'éléments est ... vous voudrez quelque chose comme:

check_for_duplicates.ContainsValue(item["Path"]);

En supposant que l'élément soit une forme de recherche. En réalité, vous devez lancer un élément ou utiliser un système de types pour accéder aux valeurs via un index.

Vous n'avez pas précisé quelle version des choses vous utilisiez. Y a-t-il une raison pour laquelle vous devez utiliser un Hashtable contre un HashSet? Vous n'auriez pas besoin de rechercher les doublons si votre structure de données ne les permettait pas. Voir aussi:

http://www.vcskicks.com/csharp_data_structures2.html

Autre que cela, la question de savoir comment accomplir la même chose dans Hashtable a déjà été abordée ici. Je souligne simplement que vous n'avez pas besoin de faire toutes les vérifications pathologiques si vous l'interdisez en premier lieu.

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