Как реализовать интерфейс 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();