繁体   English   中英

如何在C#中使用System.Math方法的泛型类

[英]How to use a generic class for System.Math methods in C#

我试图实现类似于以下代码片段的东西。

在此输入图像描述

由于红线表示IComparable<T> Math.Min似乎不起作用。 我需要将Math.MinMath.Max用于此泛型类。 T将是intdoubledecimal类型。

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

编写自己的通用MaxMin

public static T Max<T>(T x, T y)
{
    return (Comparer<T>.Default.Compare(x, y) > 0) ? x : y;
}

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

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;
  }
}

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

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.

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

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

但是一旦有人说“嘿这个类是通用的,让我们用一个包含十进制的类”,你就要小心了,你最终会陷入一个痛苦的世界,然后是时候看看这里发布的其他一些选项了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM