IComparable 一方向にしか機能しない
Employeeクラスがあるとしましょう。1つのビューでは、すべてEmployeesを名前でソートし、別のビューではアドレスでソートして表示します。どうやってそれを達成するつもりですか?ではなくIComparable、少なくとも慣用的な方法ではありません。
IComparable ロジックが間違った場所にある
を呼び出すことにより、インターフェースが使用され.Sort()ます。Customer名前で並べ替えられたビューでは、並べ替え方法を示すコードはまったくありません。
一方、Customerクラスは、どのように使用されるかを想定しています-この場合、名前でソートされたリストで使用されることを想定しています。
IComparable 暗黙的に使用されます
代替と比較して、比較ロジックがどこで使用されているか、またはまったく使用されているかどうかを確認することは非常に困難です。標準IDEを想定し、Customerクラスから始めて、
- へのすべての参照を検索
Customer - リストで使用されている参照を見つける
- それらのリストが
.Sort()それらを呼び出したことがあるかどうかを確認します
さらに悪いことに、IComparableまだ使用されている実装を削除しても、エラーや警告は表示されません。あなたが得る唯一のものはあなたが考えるにはあまりにもあいまいだったすべての場所で間違った行動です。
これらの問題が組み合わさり、要件が変わります
私がこれについて考えるようになったまさにその理由は、それが私にとって間違っていたからです。私はIComparable2年前からアプリケーションで喜んで使用しています。ここで、要件が変更され、物を2つの異なる方法でソートする必要があります。前のセクションで説明した手順を実行するのは面白くないことに気づきました。
質問
これらの問題により、代替手段ではうまく機能しない有効なユースケースが見られないという点で、またはにIComparable劣ると考えるようになります。LINQまたはLINQ を使用する方が常に良いのですか、それとも、ここで見られない利点/ユースケースがありますか?IComparer.OrderBy()
IComparer
IComparable、もう使用しないことになります。
SortedXXXコレクションを使用する場合は、保存された要素が必要であるかIComparable、IComparer提供されている必要があることを忘れないでください。また、1つの比較演算子で自然な並べ替え順序を逆にして、すべてのIComparableオブジェクトで機能させることは簡単です。
IComparableと見なされます。 IComparerデフォルトの比較メカニズムをオーバーライドする場合に使用されます。
ReverseComparer<T>:gist.github.com/jackfarrington/078e7af7bc82482aa634