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



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



BankAccount[] a;
. . .

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


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

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



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


но я не уверен, что это правильное решение. Какие-нибудь советы?

487   6  

6 ответов:

вы не должны определять IComparable самостоятельно. Это уже определено.

, а нужно реализовать icomparable, который на своем BankAccount класса.

где определено class BankAccount, убедитесь, что он реализует интерфейс IComparable

потом пиши BankAccout.CompareTo для сравнения балансовых сумм двух объектов.


Edit

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;
    }
}

Edit 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();

Comments

    Ничего не найдено.