Использование IEqualityComparer для определения уникальности

#c#

#c#

Вопрос:

Я использую HashSet. Я хочу убедиться, что у меня нет повторяющихся значений. Однако в настоящий момент я могу это сделать.

 [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;
    }

}
  

Я исключил конструкторы и дополнительный ненужный код, такой как другие поля
Когда я выполняю следующие операции, я получаю нежелательные результаты:

Добавить (новые результаты сжатия(1)); Результат: true
Добавить(новые результаты сжатия(1)); Результат: true <--- это дублирующий параметр, и я не хочу, чтобы он добавлял
Удалить(новые результаты сжатия(1)); Результат: true

заранее спасибо за вашу помощь!

Ответ №1:

Я полагаю, проблема в том, что в вашем Add() коде вы сначала удаляете существующий элемент, а затем добавляете новый (дублированный). Это всегда будет успешным, поскольку дубликатов нет, поэтому он и возвращает true . Удалите Remove() вызов, и он исправится сам.