Как реализовать интерфейс 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 ответов:
вы не должны определять IComparable самостоятельно. Это уже определено.
, а нужно реализовать icomparable, который на своем
BankAccountкласса.где определено
class BankAccount, убедитесь, что он реализует интерфейс IComparableпотом пиши
BankAccout.CompareToдля сравнения балансовых сумм двух объектов.
Edit
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; } }
Edit 2 чтобы показать Джеффри L Хороший ответ ringham в:
public class BankAccount : IComparable<BankAccount> { [...] public int CompareTo(BankAccount that) { return this.Balance.CompareTo(that.Balance); } }
IComparableуже существует в .NET с этим определением CompareToint 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. } }
вы хотите диструктивные сортировка массива? То есть, вы хотите на самом деле изменить порядок элементов в массиве? Или вы просто хотите список элементов в определенном порядке, не разрушая исходный порядок?
Я бы предположил, что почти всегда лучше делать последнее. Рассмотрите возможность использования LINQ для неразрушающего заказ. (И рассмотрите возможность использования более значимого имени переменной, чем"a".)
BankAccount[] bankAccounts = { whatever }; var sortedByBalance = from bankAccount in bankAccounts orderby bankAccount.Balance select bankAccount; Display(sortedByBalance);
в качестве альтернативы можно использовать LINQ и пропускать реализации интерфейса icomparable:
BankAccount[] sorted = a.OrderBy(ba => ba.Balance).ToArray();
уже
IComparable<T>, но в идеале, вы должны поддерживать какIComparable<T>иIComparable. Используя встроенныйComparer<T>.Default- это, как правило, более простой вариант.Array.Sort, например, примет такой компаратор.
Если вам нужно только для того, чтобы эти
BankAccountsиспользуйтеLINQследующееBankAccount[] a = new BankAccount[] { new BankAccount("George Smith", 500m), new BankAccount("Sid Zimmerman", 300m) }; a = a.OrderBy(bank => bank.Balance).ToArray();
Comments