从现有集合创建C#SortedSet

从现有集合创建C#SortedSet,c#,sortedset,C#,Sortedset,我有一个包含6项的现有哈希集:{Value:3,事件:1},{Value:1,事件:2},{Value:4,事件:2},{Value:5,事件:1},{Value:2,事件:1},{Value:6,事件:1} 元素类别: internal class Element { public Element(int value) { this.Value = value; this.Occurrence = 1; } public

我有一个包含6项的现有哈希集:{Value:3,事件:1},{Value:1,事件:2},{Value:4,事件:2},{Value:5,事件:1},{Value:2,事件:1},{Value: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());
var sortedSet=new sortedSet(hashSet.AsEnumerable(),new 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;
    }
}
内部类SortedSetComparer:IComparer
{
公共整数比较(元素x、元素y)
{
如果(x!=null&&y!=null)
{
如果(x.事件>y.事件)
{
返回1;
}
如果(y.事件>x.事件)
{
返回-1;
}
返回0;
}
返回0;
}
}
但在debug中,我看到只有两个第一个元素进入了排序集:{Value:3,引用:1}和{Value:1,引用:2}

我做错了什么?

根据(和):

不允许重复的元素

由于在比较方法中,如果两个对象具有相同的
出现次数
(但不同的
),则返回0,因此集合认为这两个对象是。净效应-它为每个
事件
值添加第一项,并忽略其余项

要解决此问题,您的比较必须先比较
事件
,然后再比较
。仅当出现次数
相等时,才应返回0。

根据(和):

不允许重复的元素

由于在比较方法中,如果两个对象具有相同的
出现次数
(但不同的
),则返回0,因此集合认为这两个对象是。净效应-它为每个
事件
值添加第一项,并忽略其余项


要解决此问题,您的比较必须先比较
事件
,然后再比较
。只有当出现次数
相等时,才应返回0。

您没有比较
是您的主要问题。您实际上是在说
{Value:1,事件:2}
{Value:4,事件:2}
是相同的,因为这是0所表示的。我希望它们按事件而不是值排序。无论如何,它们不应该都去排序集,而不管底层的比较器是什么吗?“一个集没有重复项”-我不知道,这是我的错。。你能把你的答案贴出来吗?我会接受的。NET框架没有现成的。如果需要的话,你必须使用技巧。你不是在比较
是你的主要问题。您实际上是在说
{Value:1,事件:2}
{Value:4,事件:2}
是相同的,因为这是0所表示的。我希望它们按事件而不是值排序。无论如何,它们不应该都去排序集,而不管底层的比较器是什么吗?“一个集没有重复项”-我不知道,这是我的错。。你能把你的答案贴出来吗?我会接受的。NET框架没有现成的。如果你需要的话,你必须使用技巧。