IComparableT 作为实现接口的示例

接口看起来很抽象,直到你在实践中看起来它们。IComparableIComparable<T> 是界面为什么对我们有所帮助的很好的例子。

假设在一个在线商店的程序中,我们有各种各样的商品你可以买。每个项目都有一个名称,一个 ID 号和一个价格。

public class Item {
    
    public string name; // though public variables are generally bad practice,
    public int idNumber; // to keep this example simple we will use them instead
    public decimal price; // of a property.

    // body omitted for brevity        

}

我们将 Item 存储在 List<Item> 中,在我们的程序中,我们希望按 ID 编号从最小到最大排序。我们可以改为使用 List<T> 已经拥有的 Sort() 方法,而不是编写我们自己的排序算法。但是,由于我们的 Item 类现在正在使用,因此 List<T> 无法理解对列表进行排序的顺序。这是 IComparable 接口的用武之地。

为了正确实现 CompareTo 方法,如果参数小于当前值,则 CompareTo 应返回正数,如果相等则为 0,如果参数大于,则返回负数。

Item apple = new Item();
apple.idNumber = 15;
Item banana = new Item();
banana.idNumber = 4;
Item cow = new Item();
cow.idNumber = 15;
Item diamond = new Item();
diamond.idNumber = 18;

Console.WriteLine(apple.CompareTo(banana)); // 11
Console.WriteLine(apple.CompareTo(cow)); // 0
Console.WriteLine(apple.CompareTo(diamond)); // -3

这是示例 Item 的接口实现:

public class Item : IComparable<Item> {
    
    private string name;
    private int idNumber;
    private decimal price;

    public int CompareTo(Item otherItem) {

        return (this.idNumber - otherItem.idNumber);

    }

    // rest of code omitted for brevity    

}

在表面层面上,我们项目中的 CompareTo 方法只返回其 ID 号的差异,但上述内容在实践中做了什么?

现在,当我们在 List<Item> 对象上调用 Sort() 时,List 会在需要确定放置对象的顺序时自动调用 ItemCompareTo 方法。此外,除了 List<T> 之外,任何其他需要能够比较两个对象的对象都可以工作与 Item 因为我们已经定义了两种不同的 Items 相互比较的能力。