我有一个类似的方法:

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)

每个方法的单一责任会说你的方法应该只做一件事 - 计算算术平均值 - 就是这样。没有“AndDoSomeOtherMath”。

如果你看一下 公式 对于平均值,你当然可以只用一个点来计算出一些有意义的东西。标准差需要两个或更多。

仅供参考,您可以即时计算平均值和标准差,而无需存储所有值。记忆起来容易多了。约翰·D.库克有一个 很棒的博客文章 关于如何计算标准差。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top