3

我正在尝试实现类似于以下代码片段的内容。

在此处输入图像描述

正如红线所示Math.MinIComparable<T>似乎不起作用。我需要为这个泛型类使用Math.MinMath.Max。将Tintdoubledecimal类型。

我怎么能轻松解决这个问题?

4

3 回答 3

3

编写自己的通用MaxMin

public static T Max<T>(T x, T y)
{
    return (Comparer<T>.Default.Compare(x, y) > 0) ? x : y;
}
于 2012-07-25T06:45:58.427 回答
2

算术运算没有通用解决方案。但是对于简单的比较,您可以自己简单地实现它:

T Min<T>(T x1, T x2) where T:IComparable<T>
{
  int comp=x1.CompareTo(x2);
  if(comp<=0)
    return x1;
  else
    return x2;
}

但我通常会避免IComparable<T>约束,而是要求用户作为参数传入构造函数,如果他没有指定,则IComparer<T>默认为。Comparer<T>.Default

这种技术甚至允许在未实现的类型上使用该类IComparable<T>,前提是用户传递了替代实现。

class Foo<T>
{
  readonly IComparer<T> _comparer;

  public Foo()
    :this(Comparer<T>.Default)
  {
  }

  public Foo(IComparer<T> comparer)
  {
    _comparer=comparer;
  }

  T Min(T x1, T x2)
  {
    int comp = _comparer.Compare(x1,x2);
    if(comp <= 0)
      return x1;
    else
      return x2;
  }
}
于 2012-07-25T06:46:25.837 回答
0

好的,所以它将是一个 int、decimal 或 double,所以丑陋的 hack 是做类似的事情

if not null
   if(decimal.tryparse(val.ToString(), out aDecimal))
      and if the other value can be made into a decimal
          return math.max or min or what ever.

我已经后悔使用伪代码了...

根据您包含的数字类型,您只需将其中最大的用于上述检查。

请注意,一旦有人说,“嘿,这个类是通用的,让我们将它与一个包含小数的类一起使用”,你最终会陷入痛苦的世界,然后是时候看看这里发布的其他一些选项了。

于 2012-07-25T06:52:16.167 回答