我正在尝试实现类似于以下代码段的内容。
由于红线表示Math.Min
的{{1}}似乎不起作用。我需要对此通用类使用IComparable<T>
或Math.Min
。 Math.Max
将为T
或int
或double
类型。
我怎么能轻易解决这个问题?
答案 0 :(得分:3)
编写您自己的通用Max
和Min
public static T Max<T>(T x, T y)
{
return (Comparer<T>.Default.Compare(x, y) > 0) ? x : y;
}
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
好的,所以它会是一个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.
我已经后悔使用伪代码......
根据您所包含的数字类型,您只需使用其中最大的数字进行上述检查。
小心虽然有人说,“嘿,这个类是通用的,让我们用一个包含十进制的类”,你最终会陷入痛苦的世界,然后是时候看看其他一些选项了发布在这里。