2009-04-06 4 views
0

Nous sommes désolés de vous le demander à nouveau. J'ai lu les sujets connexes ici pendant des heures et ne comprends toujours pas certains des problèmes avec le casting et les génériques. J'essaie de créer notre propre classe HashSet, car nous ne pouvons pas encore utiliser .net 3.5.puis-je lancer un objet à son type générique en C#?

L'erreur est dans la méthode RetainAll, ci-dessous. Il compile bien mais je reçois une erreur d'exécution 'Impossible de convertir un objet de type' System.Collections.DictionaryEntry 'pour taper' monentreprise.UnivID 'dans l'instruction foreach. Est-ce que cela signifie que je ne peux pas convertir un objet générique en type d'implémentation? J'ai essayé quelques choses comme

foreach ((T) obj in set) 

mais ils ne compilent pas.

Code pertinent est:

public sealed class HashSet<T> : ISet<T> { 

    private readonly Hashtable set; 

    public HashSet() { 
    this.set = new Hashtable(); 
    } 

    public void RetainAll(ISet<T> c) { 
    lock (set) { 
     foreach (T obj in set) { 
     if (!c.Contains(obj)) 
      this.set.Remove(obj); 
     } 
    } 
    } 
} 

L'extrait de classe implémentant est

public sealed class UnivIDSet : ISet { 
    private readonly ISet<UnivID> univIDs; 

    public UnivIDSet() : base() { 
    univIDs = new HashSet<UnivID>(); 
    } 
} 

et nous avons notre classe UnivID qui sont en fait les objets dans les ensembles.

Répondre

5

Je pense

foreach (T obj in set) { 

devrait être

foreach (T obj in set.Values) { 
+0

oui, c'était ça. Merci! Je suis un peu gêné maintenant par la question. J'aurais dû savoir ou être capable de le comprendre. – user26270

+0

Ha ha, arrive à nous tous. Parfois, une autre paire d'yeux aide. –

0

Lorsque vous énumérez une table de hachage du type le rendement recenseur est un DictionaryEntry. Lisez les propriétés Key et Value de cet objet pour obtenir ce dont vous avez besoin.

0

Les tables de hachage mappent les clés aux valeurs. Lorsque vous parcourez chaque élément de la table de hachage, cet élément est une paire clé/valeur (c'est ce que la classe DictionaryEntry est). Vous souhaitez probablement parcourir plutôt la propriété Keys ou la propriété Values, en fonction de la manière dont vous avez entré les éléments dans la table.

Notez également que la classe Dictionary est la version générique d'une table de hachage. Il est donc préférable de construire votre HashSet à la place.

Questions connexes