Подтвердить что ты не робот

Как реализовать интерфейс IComparable?

Я заполняю массив экземплярами класса:

BankAccount[] a;
. . .

a = new BankAccount[]
{
    new BankAccount("George Smith", 500m),
    new BankAccount("Sid Zimmerman", 300m)
};

Как только я заполню этот массив, я хотел бы отсортировать его по балансовым суммам. Чтобы сделать это, я хотел бы иметь возможность проверить, можно ли сортировать каждый элемент с помощью IComparable.

Мне нужно сделать это с помощью интерфейсов. Пока у меня есть следующий код:

public interface IComparable
{
    decimal CompareTo(BankAccount obj);
}

Но я не уверен, что это правильное решение. Любые советы?

4b9b3361

Ответ 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();