我的方法如下:
AverageAndDoSomeMath (Point2)
我想知道如何处理:
AverageAndDoSomeMath (Point2) // single
AverageAndDoSomeMath (Point2 collection) // multiple
最好使用单个实现。
对于集合,我计划使用IEnumerable类型,因此我可以传递任何类型的集合,但对于单个值,我不想将其包装并作为集合传递,因为集合本身没有用处,除了满足类型。
如何以最清晰,最快速,最有效的方式处理它?</ p>
编辑:也许我应该选择一个更好的方法名称,但是该方法计算所有点的平均值,对于1值没有意义,但将其视为该值将用于表示计算另一个值,但重要的是找到平均值,所以我不能称之为第一种方法。
答案 0 :(得分:9)
写两个方法
并将第一个通过将其包装在一个集合中来调用第二个。
public decimal AverageAndDoSomeMath (Point2 point)
{
return AverageAndSomeMath(new []{point});
}
我猜这是你已经想到的,但认为这不是正确的解决方案,对吧?
修改:简化方法(感谢Freddy Rios)
答案 1 :(得分:9)
我知道你说你不想把它包起来并把它作为一个集合传递,但有两种方法你可以用最小的麻烦来做到这一点,所以如果你不知道一个,我会发布它们
您可以在方法上使用参数:
public void Average(params Point2[] points)
之后你可以使用任意数量的参数或数组调用它:
Average(P1);
Average(P2, P3, P4);
Average(); // this one becomes an empty array in the method
Point[] array = new Point[] { P1, P2, P3, P4 };
Average(array);
或者,您可以使用短数组语法来包装对象:
Average({ P1 }); // this is legal C# for making an array with 1 element
编辑:阅读完笔记后,我建议使用params数组是最理想的方法。唯一真正的缺点是,如果没有先调用IEnumerable<Point2>
,就无法传递List<Point2>
(或ToArray()
之类的其他集合),因为它只需要实际数组。
答案 2 :(得分:1)
每种方法的一个责任就是说你的方法应该只做一件事 - 计算算术平均值 - 就是这样。没有“AndDoSomeOtherMath”。
如果你看一下formula的平均值,你当然可以用一点来计算一些有意义的东西。它的标准偏差需要两个或更多。
仅供参考,您可以动态计算平均值和标准差,而无需存储所有值。记忆力要容易得多。约翰D.库克有great blog article关于如何做标准偏差的事。