题
我有一个类似的方法:
AverageAndDoSomeMath (Point2)
我想知道如何处理:
AverageAndDoSomeMath (Point2) // single
AverageAndDoSomeMath (Point2 collection) // multiple
最好使用单个实现。
对于集合,我计划使用 IEnumerable 类型,这样我就可以传递任何类型的集合,但对于单个值,我不想将其包装并作为集合传递,因为集合本身没有任何用途,除了满足类型。
如何以最清晰、最快、最有效的方式进行最佳处理?
编辑:也许我应该选择一个更好的方法名称,但是该方法计算所有点的平均值,对于 1 个值来说它没有意义,但可以将其视为该值将用于计算另一个值,但是什么是重要的是找到平均值,所以我不能调用第一种方法。
解决方案
我知道您说过您不想包装它并将其作为集合传递,但是有两种方法可以轻松地做到这一点,所以我将发布它们以防您不知道其中一种。
您可以在您的方法上使用参数:
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()
, ,因为它只需要实际的数组。
其他提示
写两个方法
- AverageAndDoSomeMath(Point2点)
- AverageAndDoSomeMath(IEnumerable<Point2> 点)
并将第一个函数包装在一个集合中来调用第二个函数。
public decimal AverageAndDoSomeMath (Point2 point)
{
return AverageAndSomeMath(new []{point});
}
我猜您已经想到了这一点,但认为这不是正确的解决方案,对吗?
编辑: 简化了方法(感谢 Freddy Rios)
不隶属于 StackOverflow