考虑这个课程
public class A
{
float Order
string Name
public A(float order, string name)
{
Order = order;
Name = name;
}
}
如果我要将其添加到SortedSet<A>
,它将如何知道订购哪个会员?如果我可以在第一时间,我将如何指定这一点。我认为该集合的最佳性能是在添加时对其进行排序,而不是添加然后通过Sort()
进行排序。
答案 0 :(得分:4)
SortedSet<A>
希望您的班级实施IComparable<A>
。或者,您可以提供类型为IComparer<A>
的比较器,以便在您的课程外部进行排序,如下所示:
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);
}
}
现在,您可以使用不同的比较器创建两个有序集:
var soredByOrder = new SortedSet<A>(new ComparerForAByOrder());
var soredByName = new SortedSet<A>(new ComparerForAByName());
答案 1 :(得分:1)
假设您更改了辅助功能,以便您可以从课外读取成员A
,您可以这样做:
new SortedSet<A>(Comparer<A>.Create((a1, a2) => a1.Order.CompareTo(a2.Order)))
这需要.NET 4.5或更高版本。
请记住,NaN
将比其他所有内容都要少。
如果您没有将自己的比较器传递给构造函数,则会检查A
的每个实例是否为实现IComparable<>
或IComparable
的运行时类型。如果不是,则在添加到SortedSet<A>
时会产生错误。