从现有集合创建C#SortedSet

时间:2019-06-21 14:10:19

标签: c# sortedset

我有一个包含6个项目的现有HashSet:{值: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 个答案:

答案 0 :(得分:2)

根据the docs(和by definition):

  

不允许重复的元素。

由于在比较方法中,如果两个对象具有相同的Occurrence(但不同的Value)则返回0,因此该集合认为这两个对象为equal。净效果-它为每个Occurrence值添加第一项,而忽略其余值。

要解决此问题,您的比较必须比较Occurrence ,然后也要比较Value。仅当两者 OccurrenceValue相等时才返回 0。