Как реализовать интерфейс IComparable?
Я заполняю массив экземплярами класса:
BankAccount[] a;
. . .
a = new BankAccount[]
{
new BankAccount("George Smith", 500m),
new BankAccount("Sid Zimmerman", 300m)
};
Как только я заполню этот массив, я хотел бы отсортировать его по балансовым суммам. Чтобы сделать это, я хотел бы иметь возможность проверить, можно ли сортировать каждый элемент с помощью IComparable
.
Мне нужно сделать это с помощью интерфейсов. Пока у меня есть следующий код:
public interface IComparable
{
decimal CompareTo(BankAccount obj);
}
Но я не уверен, что это правильное решение. Любые советы?
Ответы
Ответ 1
Вы не должны определять 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, чтобы показать Джеффри Л. Уитледжу хороший ответ:
public class BankAccount : IComparable<BankAccount>
{
[...]
public int CompareTo(BankAccount that)
{
return this.Balance.CompareTo(that.Balance);
}
}
Ответ 2
Вы хотите разрушить массив? То есть, вы действительно хотите изменить порядок элементов в массиве? Или вам просто нужен список предметов в определенном порядке, не нарушая первоначальный порядок?
Я бы предположил, что почти всегда лучше делать последнее. Рассмотрим использование LINQ для неразрушающего упорядочения. (И подумайте об использовании более значимого имени переменной, чем "a".)
BankAccount[] bankAccounts = { whatever };
var sortedByBalance = from bankAccount in bankAccounts
orderby bankAccount.Balance
select bankAccount;
Display(sortedByBalance);
Ответ 3
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.
}
}
Ответ 4
Альтернативой является использование LINQ и пропустить реализацию IComparable вообще:
BankAccount[] sorted = a.OrderBy(ba => ba.Balance).ToArray();
Ответ 5
Уже существует IComparable<T>
, но в идеале вы должны поддерживать как IComparable<T>
и IComparable
. Использование встроенного Comparer<T>.Default
как правило, более простой вариант. Array.Sort
, например, примет такой компаратор.
Ответ 6
Если вам нужно отсортировать эти BankAccounts
, используйте LINQ
, как показано ниже
BankAccount[] a = new BankAccount[]
{
new BankAccount("George Smith", 500m),
new BankAccount("Sid Zimmerman", 300m)
};
a = a.OrderBy(bank => bank.Balance).ToArray();