我使用类的实例填充数组:
BankAccount[] a;
. . .
a = new BankAccount[]
{
new BankAccount("George Smith", 500m),
new BankAccount("Sid Zimmerman", 300m)
};
一旦我填充此数组,我想按余额金额对其进行排序。为了做到这一点,我希望能够使用IComparable
检查每个元素是否可排序。
我需要使用接口来做到这一点。到目前为止,我有以下代码:
public interface IComparable
{
decimal CompareTo(BankAccount obj);
}
但我不确定这是否是正确的解决方案。有什么建议吗?
答案 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)
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();