Как реализовать интерфейс 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
для сравнения балансовых сумм двух объектов.
редактировать
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 показать Джеффри L Хороший ответ ringham в:
public class BankAccount : IComparable<BankAccount>
{
[...]
public int CompareTo(BankAccount that)
{
return this.Balance.CompareTo(that.Balance);
}
}
IComparable
уже существует в .NET с этим определением 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.
}
}
вы хотите диструктивные сортировка массива? То есть, вы действительно хотите изменить порядок элементов в массиве? Или вы просто хотите список элементов в определенном порядке, не разрушая исходный порядок?
Я бы предположил, что почти всегда лучше делать последнее. Рассмотрите возможность использования 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();