Несколько одинаковых объектов в SortedSet со специфической реализацией IComparer

Мне необходимо создать такую структуру данных, в рамках которой все объекты класса Test будут упорядочены от большего к меньшему по полю Factor. Если окажется так, что в SortedSet уже есть элемент с Factor, равным вставляемому, то зависимости от значения AdditionalFactor мне нужно вставить его либо выше, либо ниже. Есть следующая реализация IComparer:

public class FirstComparer : IComparer<Test>
{

  public int Compare(Test x, Test y)
  {
     if(x==null || y == null)
       return 0;
     
     if(x.Factor== y.Factor)
      return x.AdditionalFactor == 0? 1:-1;

     var result = y.Factor.CompareTo(x.Factor)
     return result;

  }
}

Класс Test:

  public class Test
    {
       public int Factor {get; private set;}
       public int AdditionalFactor {get; private set;}
       
       public Test(int factor, int additional)
       {
        Factor = factor;
        AdditionalFactor = additional;
       }
    }

Я создаю SortedSet:

var set = new SortedSet<Test>(new FirstComparer());

При вставке все работает хорошо, однако я заметил, что теперь я не могу удалить элемент, так как мой кастомный Comparer никогда не возвращает 0 (равенство объектов).

Подскажите, можно ли разрешить данную проблему в рамках Comparer или же нужно использовать не SortedSet, а писать собственную коллекцию?


Ответы (1 шт):

Автор решения: Aziz Umarov

Измените проверку

if(x.Factor== y.Factor && x.AdditionalFactor != y.AdditionalFactor)
      return x.AdditionalFactor == 0  ? 1:-1;

И можете удалить первое условие с null оно туда никогда не попадет

→ Ссылка