如何实现IComparable接口?

时间:2010-11-15 19:24:13

标签: c# interface icomparable

我使用类的实例填充数组:

BankAccount[] a;
. . .

a = new BankAccount[]
{
    new BankAccount("George Smith", 500m),
    new BankAccount("Sid Zimmerman", 300m)
};

一旦我填充此数组,我想按余额金额对其进行排序。为了做到这一点,我希望能够使用IComparable检查每个元素是否可排序。
我需要使用接口来做到这一点。到目前为止,我有以下代码:

public interface IComparable
{
    decimal CompareTo(BankAccount obj);
}

但我不确定这是否是正确的解决方案。有什么建议吗?

6 个答案:

答案 0 :(得分:117)

您不应该自己定义IComparable。它已经定义了。

相反,您需要在BankAccount课程实施 IComparable。

您定义class BankAccount的位置,请确保它实现了IComparable接口

然后写BankAccout.CompareTo来比较两个对象的余额。


修改

public class BankAccount : IComparable<BankAccount>
{
    [...]

    public int CompareTo(BankAccount that)
    {
        if (this.Balance >  that.Balance) return -1;
        if (this.Balance == that.Balance) return 0;
        return 1;
    }
}

编辑2 以显示Jeffrey L Whitledge的好答案:

public class BankAccount : IComparable<BankAccount>
{
    [...]

    public int CompareTo(BankAccount that)
    {
        return this.Balance.CompareTo(that.Balance);
    }
}

答案 1 :(得分:15)

你想破坏性地对数组进行排序吗?也就是说,您是否想要实际更改数组中项目的顺序?或者你只是想要一个特定顺序的项目列表,而不破坏原始订单?

我认为做后者几乎总是更好。考虑使用LINQ进行非破坏性排序。 (并考虑使用比“a”更有意义的变量名。)

BankAccount[] bankAccounts = { whatever };
var sortedByBalance = from bankAccount in bankAccounts 
                      orderby bankAccount.Balance 
                      select bankAccount;
Display(sortedByBalance);

答案 2 :(得分:14)

.NET中已存在

IComparable,其定义为CompareTo

int CompareTo(Object obj)

你不应该创建界面 - 你应该实现它。

public class BankAccount : IComparable {

    int CompareTo(Object obj) {
           // return Less than zero if this object 
           // is less than the object specified by the CompareTo method.

           // return Zero if this object is equal to the object 
           // specified by the CompareTo method.

           // return Greater than zero if this object is greater than 
           // the object specified by the CompareTo method.
    }
}

答案 3 :(得分:10)

另一种方法是使用LINQ并完全跳过实现IComparable:

BankAccount[] sorted = a.OrderBy(ba => ba.Balance).ToArray();

答案 4 :(得分:5)

已经有IComparable<T>,但理想情况下您应该同时支持IComparable<T>IComparable。使用内置Comparer<T>.Default通常是一个更容易的选择。例如,Array.Sort将接受这样的比较器。

答案 5 :(得分:2)

如果您只需要对这些BankAccounts进行排序,请使用LINQ,如下所示

BankAccount[] a = new BankAccount[]
{
    new BankAccount("George Smith", 500m),
    new BankAccount("Sid Zimmerman", 300m)
};

a = a.OrderBy(bank => bank.Balance).ToArray();