【问题标题】:Implement CompareTo() - compare by various functions实现 CompareTo() - 通过各种函数进行比较
【发布时间】:2017-01-31 15:12:51
【问题描述】:

我像这样实现了CompareTo()

 public override int CompareTo(object obj)
 {
   //quick failsafe
   MyClass other;
   if (obj is MyClass)
   {
     other = obj as MyClass;
   }
   else 
   { 
     return 1; 
   }
   //now we should have another comparable object.
   /*
    * 1: this is greater.
    * 0: equals.
    * -1: this is less.  
    */
   if (other.GetValue() < this.GetValue())
   {
     // this is bigger
     return 1;
   }
   else if (other.GetValue() > this.GetValue())
   {
     //this is smaller
     return -1;
   }
   else 
   { 
     return 0; 
   }
}

但是,当我想选择函数 GetValue() 时,事情变得有趣起来。我为此设置了几个:即Average()Best()CorrectedAverage()Median()。顺便说一下,我通过floats 的数组进行比较。问题是,我不想在我在此类中定义的enum 上使用switch-case 来告诉订购什么。有没有办法让我通过 nice and clean 来决定要订购哪个功能?

【问题讨论】:

    标签: c# compare compareto


    【解决方案1】:

    鉴于您的班级有一大堆不同的比较方式,它几乎肯定根本不应该实现IComparable

    相反,为比较对象的每种不同方式创建IComparer&lt;T&gt; 实例。想要比较该类型实例的人可以选择使用最适合他们情况的比较的比较器。

    【讨论】:

    • 感谢您的帮助。我有一点你的意思,但你能再解释一下吗?我的意思是,怎么做?
    • @hei 您创建了一个实现IComparer&lt;T&gt; 的类,用于比较对象的每种方式。每个对象都以不同的方式比较它们。希望执行需要知道如何比较这些对象的操作(例如,排序操作)的人可以接受适合情况的比较器。如果他们想使用中位数进行比较,他们使用MedianComparer,如果他们想使用平均值进行比较,他们使用MeanComparer,依此类推。
    • 所以我有 4 个“CompareTo()”函数?我或多或少复制粘贴,只是使用不同的功能而不是GetValue()
    • @hei 你不会复制粘贴的。几乎没有一个功能会重叠。拥有return firstArray.Median().CompareTo(second.Median()); 并没有与其他选项有足够的重叠来真正需要复制粘贴。即使它们具有相似的结构,它们的功能也不尽相同。
    • 感谢您的帮助。我去实现它。
    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多