C# 按项目成员对SortedSet进行排序

C# 按项目成员对SortedSet进行排序,c#,.net,collections,set,C#,.net,Collections,Set,以这门课为例 public class A { float Order string Name public A(float order, string name) { Order = order; Name = name; } } 如果我将此添加到SortedSet中,它如何知道该由哪个成员订购?如果一开始我可以的话,我将如何具体说明这一点。我认为集合的最佳性能是在add上对其进行排序,而不是添加,

以这门课为例

public class A
{
     float Order
     string Name
     public A(float order, string name)
     {
           Order = order;
           Name = name;
     }
}
如果我将此添加到
SortedSet
中,它如何知道该由哪个成员订购?如果一开始我可以的话,我将如何具体说明这一点。我认为集合的最佳性能是在add上对其进行排序,而不是添加,然后通过
Sort()

SortedSet对类进行外部排序,如下所示:

class ComparerForClassAByOrder : IComparer<A> {
    public int Compare(A left, A right) {
        return Math.Sign(left.Order-right.Order);
    }
}

class ComparerForClassAByName : IComparer<A> {
    public int Compare(A left, A right) {
        return left.Name.CompareTo(right.Name);
    }
}
类比较器或类比较器:IComparer{
公共整数比较(左、右){
返回数学符号(左。右。顺序);
}
}
类比较器ForClassAByname:IComparer{
公共整数比较(左、右){
返回left.Name.CompareTo(right.Name);
}
}
现在,您可以使用不同的比较器创建两个排序集:

var soredByOrder = new SortedSet<A>(new ComparerForAByOrder());
var soredByName = new SortedSet<A>(new ComparerForAByName());
var soredByOrder=new SortedSet(new ComparerForAByOrder());
var soredByName=new SortedSet(new ComparerForAByName());

假设您更改了可访问性,以便可以从类外读取
A
的成员,您只需执行以下操作:

new SortedSet<A>(Comparer<A>.Create((a1, a2) => a1.Order.CompareTo(a2.Order)))
newsortedset(Comparer.Create((a1,a2)=>a1.Order.CompareTo(a2.Order)))
这需要.NET 4.5或更高版本

请记住,
NaN
比其他任何东西都要少


如果您没有将自己的比较器传递给构造函数,将检查
A
的每个实例是否属于实现
IComparable
IComparable
的运行时类型。如果没有,则在添加到
SortedSet

时会产生错误。好的,新问题,假设我希望创建两个SortedSet,一个按
顺序
,另一个按
名称
,我猜这是不可能的,因为您只能继承一次
IComparable
:(@redcodefinal,在本例中,实现几个特定的IComparer类型(针对您希望的每个顺序)。@elgonzo谢谢,一定要查找它!感谢DasLinkedLights的帮助。@redcodefinal,让您的类A实现IComparable与默认的A自然顺序(如果您的类有这样的自然顺序)。对于其他订单方案,实现特定的IComparer类型。有一个静态方法
Comparer.Create
,它从“公式”(委托)为您创建一个比较器;请参阅我的答案。