web-dev-qa-db-ja.com

IComparableインターフェイスを実装する方法

クラスのインスタンスを配列に追加しています:

BankAccount[] a;
. . .

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

この配列にデータを入力したら、残高でソートします。そのためには、IComparableを使用して各要素がソート可能かどうかを確認できるようにします。
インターフェイスを使用してこれを行う必要があります。これまでのところ、次のコードがあります。

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

しかし、これが正しい解決策であるかどうかはわかりません。何かアドバイス?

IComparableを自分で定義しないでください。定義済みです。

むしろ、IComparableクラスでimplementBankAccountが必要です。

class BankAccountを定義した場所で、IComparableインターフェイスが実装されていることを確認してください

次に、BankAccout.CompareToと記述して、2つのオブジェクトの残高を比較します。


編集

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 Jeffrey L Whitledgeの良い答えを示すため:

public class BankAccount : IComparable<BankAccount>
{
    [...]

    public int CompareTo(BankAccount that)
    {
        return this.Balance.CompareTo(that.Balance);
    }
}
123
abelenky

破壊的に配列をソートしますか?つまり、実際に配列内の項目の順序を変更しますか?または、元の順序を破棄せずに、特定の順序でアイテムのリストだけが必要ですか?

私は、後者を行う方がほぼ常に良いことを提案します。非破壊的な順序付けにはLINQの使用を検討してください。 (そして、「a」よりも意味のある変数名を使用することを検討してください。)

BankAccount[] bankAccounts = { whatever };
var sortedByBalance = from bankAccount in bankAccounts 
                      orderby bankAccount.Balance 
                      select bankAccount;
Display(sortedByBalance);
15
Eric Lippert

CompareToのこの定義を持つIComparableは.NETに既に存在します

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.
    }
}
14
Lou Franco

別の方法は、LINQを使用して、IComparableの実装を完全にスキップすることです。

BankAccount[] sorted = a.OrderBy(ba => ba.Balance).ToArray();
10
Matt Greer

すでにあります IComparable<T> 、ただし理想的には両方をサポートする必要がありますIComparable<T>およびIComparable。組み込みのComparer<T>.Defaultは一般的に簡単なオプションです。 Array.Sortは、たとえば、そのような比較演算子を受け入れます。

5
Marc Gravell

これらのBankAccountsのみをソートする必要がある場合は、次のようにLINQを使用します

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

a = a.OrderBy(bank => bank.Balance).ToArray();
2
Zain Shaikh