#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()
вызов, и он исправится сам.