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