2011-01-12 8 views
2

カスタムクラスのCompareTo()メソッドをオーバーライドして、クラスに含まれているデータを複数の方法で比較する健全なアプローチはありますか?私はIComparable(Of T)を実装しようとしていますので、いくつかのベースラインインターフェイスが実装されています。ソートをまだ計画していないが、これが必要な場合は、これは私の道を救うだろう。同じタイプの2つのオブジェクトを比較する方法が複数ある場合は、CompareToをオーバーライドしますか?

MSDNの状態のほとんどは、オブジェクトが等しい場合は0、obj1がobj2より小さい場合は-1、obj1がobj1より大きい場合は-1を返さなければなりません。しかしそれはやや単純です。

IPv4アドレス(私のクラスで実装しているもの)を考えてみましょう。 IPアドレス自体とCIDRという2つの主要な考慮すべき点があります。 IPv4アドレス自体はCIDRが/ 32であると仮定されているので、その場合はCompareToメソッドでアドレスを直接比較して、一方が他方よりも大きいか小さいかを判断できます。しかし、CIDRが異なっていると、事態が複雑になります。

obj1を10.0.0.0/8、obj2を192.168.75.0/24とする。私はこれらの2つのアドレスをいくつかの方法で比較することができました。私はちょうどCIDRを無視し、obj2がobj1より大きいと考えています。私はそれらのCIDRに基づいてそれらを比較することができます.CIDRはネットワークのサイズを比較します(そして、/ 8は/ 24を非常に簡単に破ります)。私はそれらの数値アドレスとそのCIDRの両方で、それらを比較することができました.Offj2は実際には内ののobj1で定義されたネットワークでした。

このような状況を処理するために使用されるアプローチは何ですか? 2つのCompareToメソッドを定義して、別のアドレスに対して1つのアドレスを評価し、2番目のアドレスがネットワーク全体のサイズを評価するように、過負荷にすることはできますか?どのようにして配列をソートするかによって.NET Frameworkにどのようなものを使用するのかを教えてください。または、CompareTo()に依存する他の機能を実行しますか?

答えて

3

CompareToには、特定の種類のデフォルトの通常の並べ替え順序を表す比較を使用する必要があります。たとえば、あなたが与えた例では、おそらく最初にアドレスをソートし、次にサブネットサイズをソートすると考えられます。

明らかな "デフォルト"のソート順がない場合や、複数の比較方法(文字列を比較する際に大文字と小文字の区別など)がある場合は、IComparer<T>を使用することをお勧めします。これは、あなたのタイプの2つのインスタンスを比較できる別個のオブジェクトです。たとえば、AddressComparerまたはSubnetComparerです。 StringComparerが行うクラスの静的なプロパティにすることさえできます。

IComparable型を取るすべてのメソッドには、IComparerを代わりに使用するよう指定できるオーバーロードも必要です。両方を実装する必要はありませんが、意味があればそれを行います。そうすれば、必要に応じて特定の比較関数を指定したり、タイプのデフォルトの組み込みIComparableロジックを使用したりすることができます。

+1

+1。楽しい事実:.NETフレームワークで使われている "comparer"という言葉は実際の言葉ではありません... "コンパレータ"と呼ばれていたはずです。 – Mehrdad

+0

彼らはそれをICanCompareStuffと呼ぶことができました:) – Josh

+1

@Lambert:[http://en.wiktionary.org/wiki/comparer](http://en.wiktionary.org/wiki/comparer)。また、[dictionary.com](http://dictionary.reference.com/browse/compare)の単語比較の関連名詞形式としてもリストされています。 –

関連する問題