IComparable
は一方向にしか機能しませんEmployee
クラスがあるとします。 1つのビューで、すべてのEmployees
を名前でソートし、別のビューでアドレスで表示したいとします。どのようにしてそれを達成しますか? IComparable
ではなく、少なくとも慣用的な方法ではありません。
IComparable
のロジックが間違った場所にありますこのインターフェースは、.Sort()
を呼び出すことによって使用されます。 Customer
を名前で並べ替えて表示するビューでは、並べ替え方法を示すコードはまったくありません。
一方、Customer
クラスは、それがどのように使用されるかを想定しています-この場合、名前でソートされたリストで使用されます。
IComparable
は暗黙的に使用されます他の方法と比較すると、比較ロジックがどこで使用されているか、または使用されているかどうかを確認することは非常に困難です。あなたの標準IDEで、Customer
クラスから始めると仮定すると、
Customer
へのすべての参照を検索します.Sort()
が呼び出されているかどうかを確認しますさらに悪いことに、まだ使用されているIComparable
実装を削除しても、エラーや警告は表示されません。あなたが得る唯一のものは、あなたが考えるにはあまりにも曖昧であったすべての場所での間違った行動です。
私がこれについて考えるようになったまさにその理由は、それが私にとってうまくいかなかったからです。私は2年間、アプリケーションでIComparable
を楽しく使用しています。今、要件が変更され、事物は2つの異なる方法でソートされる必要があります。前のセクションで説明した手順を実行するのは面白くないことに気付きました。
これらの問題により、IComparable
はIComparer
または.OrderBy()
よりも劣ると見なされ、代替手段ではより適切に提供されない有効なユースケースが表示されなくなる。IComparer
またはLINQを使用するのが常に良いですか、それともここに表示されていない利点/使用例がありますか?
IComparable
には、あなたが述べた制限があります。これは、.NET Framework 1.0ですでに使用可能であったインターフェースであり、これらの代替機能とLinqは使用できませんでした。そう、そうです、それは主に後方互換性のために保持されている古いフレームワーク要素としてそれを見るかもしれません。
ただし、多くの単純なデータ構造では、1つのソート方法でおそらく十分または自然です。これらの場合、順序関係を実装する1つの正規の場所があることは、場所全体でOrderBy
を呼び出すたびに常に同じロジックを繰り返すのではなく、コードをDRYに保つための良い方法です。
あなたが書いたように、あなたは「今から2年間アプリケーションでIComparableを楽しく使っています」ので、長い間あなたによく役に立ったように思えます。 Sort
へのすべての呼び出しを検証、変更、テストする必要がある場合、これは多くの場所で同じ種類のソートロジックを実行していたことを示している可能性があります。これはIComparable
のせいではありません。したがって、これは、このロジックを1か所に集中化して、コードをより乾燥させる機会になる可能性があります。
IComparable
についてのあなたの意見に同意します
Array.Sort()
の備考を見てください
IComparable
インターフェイスを実装する必要があります。 (または例外がスローされます)おそらく今はやる気はないでしょう! object.Equals()
を検討して、オブジェクトが「同じ」かどうかを確認するためにオブジェクトを相互に比較できるようにする、すべてのオブジェクトのメソッド
あなたはすでにそれを持っていますが、Array.Sort()
の追加を任されています。追加したい場合はobject.Compare(object)