当有多种方法比较同一类型的两个对象时,重写CompareTo?

时间:2011-01-12 04:45:38

标签: vb.net

使用多种方法比较类中包含的数据,在自定义类中覆盖CompareTo()方法的声音方法是什么?我正在尝试实现IComparable(Of T),因此我实现了一些基线接口。还没有计划进行任何排序,但如果我需要的话,这将使我无法继续前进。

读取MSDN主要表示如果对象相等则必须返回0,如果obj1小于obj2则返回-1,或者obj1大于obj2时返回1。但这相当简单。

考虑一个IPv4地址(这是我在班上实现的)。需要考虑两个主要数字 - IP地址本身和CIDR。假设IPv4地址本身具有/ 32的CIDR,因此在这种情况下,在CompareTo方法中,我可以直接比较地址以确定一个地址是大于还是小于另一个。但是当CIDR不同时,事情变得棘手。

假设obj1为10.0.0.0/8且obj2为192.168.75.0/24。我可以通过多种方式比较这两个地址。我可以忽略CIDR,仍然认为obj2大于obj1。我可以根据他们的CIDR来比较它们,这将比较网络的大小(而且/ 8将非常容易地胜过/ 24)。我可以比较它们的数字地址和它们的CIDR,关闭机会obj2实际上是一个地址里面由obj1定义的网络。

用于处理此类情况的方法是什么?我可以定义两个CompareTo方法,重载,这样一个人可以评估一个地址相对于另一个地址,第二个会评估整个网络的大小?如何根据人们对数组进行排序的方式告诉.NET框架使用哪一个?或者做一些依赖于CompareTo()的其他功能?

1 个答案:

答案 0 :(得分:3)

对于CompareTo,您应该使用表示特定类型的默认正常排序顺序的比较。例如,在您给出的示例中,我可能希望首先对地址进行排序,然后对子网大小进行排序。

但是对于没有明显“默认”排序顺序的情况,或者有多种比较方式(例如在比较字符串时不区分大小写),推荐的方法是使用IComparer<T>。这将是一个单独的对象,可以比较您的类型的两个实例。例如,AddressComparer或SubnetComparer。你甚至可以使它们成为StringComparer所做的类的静态属性。

几乎所有采用IComparable类型的方法都应该有一个重载,允许您指定要使用的IComparer。您不必同时实现这两者,但如果有意义,请执行此操作。这样,您可以在需要时指定特定的比较器,或使用您的类型的默认内置IComparable逻辑。