2010-11-14 3 views
1

J'utilise un HashSet. Je veux m'assurer que je n'ai pas de valeurs en double. Cependant, je suis capable de le faire en ce moment.Utilisation de IEqualityComparer <T> pour déterminer l'unicité

[Serializable()] 
public class SafetyObsDS 
{ 
    public int Count 
    { 
     get { return set.Count; } 
    } 

    HashSet<CompResults> set; 

    public SafetyObsDS() 
    { 
     set = new HashSet<CompResults>(new CompareToComparer()); 
    } 

    public bool Add(CompResults cr) 
    { 
     set.Remove(cr); 
     return set.Add(cr); 
    } 

    public bool Remove(CompResults cr) 
    { 
     return set.Remove(cr); 
    } 

    [Serializable()] 
    private class CompareToComparer : IEqualityComparer<CompResults> 
    { 
     public CompareToComparer() {} 

     public bool Equals(CompResults cr1, CompResults cr2) 
     { 
      return (cr1.CompareTo(cr2) == 0); 
     } 

     public int GetHashCode(CompResults cr) 
     { 
      return (cr.SectionID); 
     } 
    } 
} 

[Serializable()] 
public class CompResults : IComparable 
{ 
    public int SectionID { get; set; } 

    public ComResults(int sectID) 
    { 
     SectionID = sectID; 
    } 

    public int CompareTo(object obj) 
    { 
     return SectionID - (obj as CompResults).SectionID; 
    } 

} 

Je reste des constructeurs et des codes supplémentaires inutiles tels que d'autres domaines sur Lorsque j'effectue les opérations suivantes, je reçois des résultats non désirés:

 
Add(new CompResults(1));  Result: true 
Add(new CompResults(1));  Result: true <--- this is a dup and I don't want it to add 
Remove(new CompResults(1)); Result: true 

Merci pour votre aide à l'avance!

Répondre

3

Je crois que le problème est que dans votre code Add(), vous devez d'abord supprimer l'élément existant, puis ajouter le nouveau (dupliqué). Ce sera toujours un succès car il n'y a pas de doublons, c'est pourquoi il retourne true. Supprimer l'appel Remove() et il va se réparer.

Questions connexes