Как реализовать интерфейс IComparable? - PullRequest
67 голосов
/ 15 ноября 2010

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

BankAccount[] a;
. . .

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

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

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

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

Ответы [ 6 ]

120 голосов
/ 15 ноября 2010

Вы не должны определять 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);
    }
}
15 голосов
/ 15 ноября 2010

Вы хотите деструктивно отсортировать массив?То есть, вы действительно хотите изменить порядок элементов в массиве?Или вы просто хотите получить список предметов в определенном порядке, не разрушая первоначальный порядок?

Я бы предположил, что почти всегда лучше делать последнее.Подумайте об использовании LINQ для неразрушающего упорядочения.(И рассмотрите возможность использования более значимого имени переменной, чем «a».)

BankAccount[] bankAccounts = { whatever };
var sortedByBalance = from bankAccount in bankAccounts 
                      orderby bankAccount.Balance 
                      select bankAccount;
Display(sortedByBalance);
14 голосов
/ 15 ноября 2010

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.
    }
}
10 голосов
/ 15 ноября 2010

Альтернативой является использование LINQ и полное отсутствие реализации IComparable:

BankAccount[] sorted = a.OrderBy(ba => ba.Balance).ToArray();
5 голосов
/ 15 ноября 2010

Уже есть IComparable<T>, но в идеале вы должны поддерживать как IComparable<T>, так и IComparable. Использование встроенного Comparer<T>.Default, как правило, более простой вариант. Array.Sort, например, примет такой компаратор.

2 голосов
/ 15 ноября 2010

Если вам нужно только отсортировать эти BankAccounts, используйте LINQ как показано ниже

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

a = a.OrderBy(bank => bank.Balance).ToArray();
...