Создание C # SortedSet из существующей коллекции - PullRequest
0 голосов
/ 21 июня 2019

У меня есть существующий HashSet с 6 элементами: {Значение: 3, Вхождение: 1}, {Значение: 1, Вхождение: 2}, {Значение: 4, Вхождение: 2}, {Значение: 5, Вхождение: 1 }, {Значение: 2, Вхождение: 1}, {Значение: 6, Вхождение: 1}

Класс элементов:

internal class Element
{
    public Element(int value)
    {
         this.Value = value;
          this.Occurrence = 1;
    }

    public int Value { get; set; }

    public int Occurrence { get; set; }
}

Как я хочу создать SortedSet из элементов этого хеш-набора следующим образом:

var sortedSet = new SortedSet<Element>(hashSet.AsEnumerable(), new SortedSetComparer());

SortedSetComparer:

 internal class SortedSetComparer : IComparer<Element>
 {
     public int Compare(Element x, Element y)
     {
         if (x != null && y != null)
         {
            if (x.Occurrence > y.Occurrence)
            {
                return 1;
            }
            if (y.Occurrence > x.Occurrence)
            {
                return -1;
            }

            return 0;
        }

        return 0;
    }
}

Но в отладке я вижу, что только 2 первых элемента попали в отсортированный набор: {Значение: 3, Вхождение: 1} и {Значение: 1, Вхождение: 2}

Что я делаю не так?

1 Ответ

2 голосов
/ 21 июня 2019

Согласно документам по определению ):

Повторяющиеся элементы не допускаются.

Св вашем методе сравнения вы возвращаете 0, если два объекта имеют одинаковый Occurrence (но различный Value), тогда набор полагает, что эти два объекта равны .Чистый эффект - он добавляет первый элемент для каждого значения Occurrence и игнорирует остальные.

Чтобы решить эту проблему, ваше сравнение должно сравнить Occurrence , а затем сравнить Valueтакже. 0 следует возвращать, только если оба Occurrence и Value равны.

...