我有一个包含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}
我在做什么错了?
答案 0 :(得分:2)
根据the docs(和by definition):
不允许重复的元素。
由于在比较方法中,如果两个对象具有相同的Occurrence
(但不同的Value
)则返回0,因此该集合认为这两个对象为equal。净效果-它为每个Occurrence
值添加第一项,而忽略其余值。
要解决此问题,您的比较必须比较Occurrence
,然后也要比较Value
。仅当两者 Occurrence
和Value
相等时才返回 0。