按项目成员对SortedSet排序

时间:2013-11-16 20:15:29

标签: c# .net collections set

考虑这个课程

public class A
{
     float Order
     string Name
     public A(float order, string name)
     {
           Order = order;
           Name = name;
     }
}

如果我要将其添加到SortedSet<A>,它将如何知道订购哪个会员?如果我可以在第一时间,我将如何指定这一点。我认为该集合的最佳性能是在添加时对其进行排序,而不是添加然后通过Sort()进行排序。

2 个答案:

答案 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>时会产生错误。