c#泛型类型约束

本文关键字:约束 泛型类型 | 更新日期: 2023-09-27 18:05:22

我以前从未使用过泛型,并且想知道如何将类型约束为Double[]List<Double>(或者这是否是正确的事情)。我需要计算许多数字的平均值,这些数字有时是事先已知的(例如,我可以创建一个精确大小的数组),但在其他时候,这些数字是在计算之前立即生成的(例如,我使用List)。

我希望这个通用方法Average(T arrayOrList)能够接受数组或列表,而不是重载Average()方法。

谢谢!

c#泛型类型约束

既然double[]List<double>都实现了IEnumerable<double>,我建议如下:

public double Average(IEnumerable<double> arrayOrList) {
    // use foreach to loop through arrayOrList and calculate the average
}

这是简单的子类型多态性,不需要泛型。

正如其他人已经提到的,如果您只是想计算平均值,那么在框架中已经存在这样的方法。

我将只使用IEnumerable<double>,因为您所需要做的就是遍历数据(列表和数组都支持这一点,延迟序列也是如此)。

事实上,微软是第一个:

var avg = sequence.Average();
http://msdn.microsoft.com/en-us/library/bb358946.aspx

为什么不直接写一个接受IEnumerable<double>的函数呢?

如果你真的想使用ArrayList,我认为你可以使用AsEnumerable()扩展。

编辑,似乎我误读了ArrayOrList,但答案仍然适用,虽然它晚了56秒

var x = new List();var average = x.Average();var y = new Double[10];var average = y.Average();