【问题标题】:C# - How to implement multiple comparers for an IComparable<T> class?C# - 如何为 IComparable<T> 类实现多个比较器?
【发布时间】:2011-01-29 14:56:14
【问题描述】:

我有一个实现 IComparable 的类。

public class MyClass : IComparable<MyClass>
{
    public int CompareTo(MyClass c)
    {
        return this.whatever.CompareTo(c.whatever);
    }

    etc..
}

然后我可以调用我的类的通用列表的排序方法

List<MyClass> c = new List<MyClass>();
//Add stuff, etc.

c.Sort();

并根据我的比较器对列表进行排序。

我如何指定更多的比较器来根据 MyClass 的其他属性对我的集合进行不同的排序,以便让用户以多种不同的方式对我的集合进行排序?

【问题讨论】:

    标签: c# sorting compare icomparable


    【解决方案1】:

    在您的班级中设置排序:

    public static Comparison<MyClass> OtherComparison = delegate(MyClass object1, MyClass object2)
    {
        return object1.Whatever.CompareTo(object2.Whatever);
    };
    

    然后使用您的新比较进行排序:

    List<MyClass> myClassList = new List<MyClass>();
    myClassList.Sort(MyClass.OtherComparison);
    

    除非您显然不想对空列表进行排序:)

    【讨论】:

    • +1 虽然你可以用 lambda 表达式写得更简洁:)
    • Kevin,我已经为此苦苦挣扎了 2 天,但我不明白它在做什么。你的方法确实有效,但是如果不写成delegate,这个静态方法怎么写?
    • @jp2code 这个答案实际上让我对比较进行了更深入的思考。我问了一个关于它的问题,我真的很喜欢接受的答案。看看这是否对您有帮助:stackoverflow.com/questions/2488298/…
    【解决方案2】:

    您可以使用特定的比较器作为参数调用 Sort。参考:MSDN

    【讨论】:

    • 我赞成 Kevin 的这个答案,因为我认为它们都是很好的解决方案。我使用了这个解决方案,因为我认为它更简单。 itemDescription/ItemNumber:我提供了一个答案来展示我的实现
    【解决方案3】:

    朝这个方向迈出的一步是使用排序重载,让您指定IComparer&lt;T&gt;(但不是IComparable&lt;T&gt;)。

    如果您已经有很多IComparable&lt;T&gt; 实现,编写一个比较两个IComparable&lt;T&gt; 实例的IComparer&lt;T&gt; 的通用实现应该很简单。事实上,我有点惊讶 BCL 中还没有这样的类,但我一直找不到。

    Comparer&lt;T&gt;.Default 接近,但不完全。

    【讨论】:

      【解决方案4】:

      如果您有多种方法可以对对象列表进行排序,显然您必须指定要选择的选项。这就是 Sort 的其他覆盖的好处。看看 IComparer 和比较。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多