gpt4 book ai didi

vb.net - 当有多种方法可以比较相同类型的两个对象时覆盖 CompareTo?

转载 作者:行者123 更新时间:2023-12-04 06:37:42 24 4
gpt4 key购买 nike

什么是覆盖 CompareTo() 的合理方法?自定义类中的方法有多种方法来比较类中包含的数据?我正在尝试实现 IComparable(Of T)就这样我实现了一些基线接口(interface)。还没有计划进行任何排序,但是如果我需要的话,这将节省我的时间。

阅读 MSDN 主要指出,如果对象相等,我们必须返回 0,如果 obj1 小于 obj2,则返回 -1,或者 1 表示 obj1 大于 obj2。但这比较简单。

考虑一个 IPv4 地址(这是我在类里面实现的)。有两个主要数字需要考虑——IP 地址本身和 CIDR。假定 IPv4 地址本身的 CIDR 为/32,因此在这种情况下,在 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() 的功能?

最佳答案

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

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

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

关于vb.net - 当有多种方法可以比较相同类型的两个对象时覆盖 CompareTo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4665420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com