【发布时间】:2011-05-01 16:20:47
【问题描述】:
我正在编写一个类,它对 C# 中的每个基本数字类型执行基本相同类型的计算。虽然实际计算更复杂,但可以将其视为一种计算多个值的平均值的方法,例如
class Calc
{
public int Count { get; private set; }
public int Total { get; private set; }
public int Average { get { return Count / Total; } }
public int AddDataPoint(int data)
{
Total += data;
Count++;
}
}
现在为了支持 double、float 以及其他定义运算符 + 和运算符 / 的类的相同操作,我的第一个想法是简单地使用泛型:
class Calc<T>
{
public T Count { get; private set; }
public T Total { get; private set; }
public T Average { get { return Count / Total; } }
public T AddDataPoint(T data)
{
Total += data;
Count++;
}
}
很遗憾C#无法判断T是否支持运算符+和/所以没有编译上面的sn-p。我的下一个想法是将 T 限制为支持这些运算符的类型,但我最初的研究表明这无法做到。
当然可以将我想要支持的每种类型装箱到一个实现自定义接口的类中,例如IMath 并将 T 限制在此范围内,但此代码将被多次调用,我想避免装箱开销。
有没有一种优雅有效的方法来解决这个问题而无需重复代码?
【问题讨论】:
-
你不能只使用 LINQ 吗? IEnumerable 支持 Sum 和 Average。
-
查看其他 SO 问题:stackoverflow.com/questions/32664/…
-
@Mathias:不,我用这个作为实际计算的简化示例。