从现有集合创建C#SortedSet
我有一个包含6项的现有哈希集:{Value:3,事件:1},{Value:1,事件:2},{Value:4,事件:2},{Value:5,事件:1},{Value:2,事件:1},{Value:6,事件:1} 元素类别:从现有集合创建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
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框架没有现成的。如果你需要的话,你必须使用技巧。