85

クラスのインスタンスを配列に入力しています。

BankAccount[] a;
. . .

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

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

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

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

4

8 に答える 8

151

自分を定義してはいけませんIComparable。すでに定義されています。むしろ、クラスに実装 する必要がありIComparableます。BankAccount

を定義した場所で、インターフェイスclass BankAccountが実装されていることを確認してください。IComparable次にBankAccount.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;
    }
}

編集して、コメントから Jeffrey L Whitledge のソリューションを表示します。

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

    public int CompareTo(BankAccount that)
    {
        return this.Balance.CompareTo(that.Balance);
    }
}
于 2010-11-15T19:28:08.703 に答える
17

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

ほとんどの場合、後者の方が良いと思います。非破壊的な注文にはLINQの使用を検討してください。(そして、「a」よりも意味のある変数名を使用することを検討してください。)

BankAccount[] bankAccounts = { whatever };
var sortedByBalance = from bankAccount in bankAccounts 
                      orderby bankAccount.Balance 
                      select bankAccount;
Display(sortedByBalance);
于 2010-11-15T19:32:44.213 に答える
16

IComparableCompareTo のこの定義で .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.
    }
}
于 2010-11-15T19:28:59.840 に答える
11

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

BankAccount[] sorted = a.OrderBy(ba => ba.Balance).ToArray();
于 2010-11-15T19:32:27.187 に答える
7

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

于 2010-11-15T19:27:08.970 に答える
2

これらを並べ替えるだけでよい場合は、次のようBankAccountsに使用しますLINQ

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

a = a.OrderBy(bank => bank.Balance).ToArray();
于 2010-11-15T19:34:37.860 に答える