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
,它从“公式”(委托)为您创建一个比较器;请参阅我的答案。