クラスのインスタンスを配列に追加しています:
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);
}
}
破壊的に配列をソートしますか?つまり、実際に配列内の項目の順序を変更しますか?または、元の順序を破棄せずに、特定の順序でアイテムのリストだけが必要ですか?
私は、後者を行う方がほぼ常に良いことを提案します。非破壊的な順序付けにはLINQの使用を検討してください。 (そして、「a」よりも意味のある変数名を使用することを検討してください。)
BankAccount[] bankAccounts = { whatever };
var sortedByBalance = from bankAccount in bankAccounts
orderby bankAccount.Balance
select bankAccount;
Display(sortedByBalance);
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.
}
}
別の方法は、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();