有效地处理C#方法中的单个和多个值

时间:2009-03-02 18:03:46

标签: c# .net methods

我的方法如下:

AverageAndDoSomeMath (Point2)

我想知道如何处理:

AverageAndDoSomeMath (Point2) // single
AverageAndDoSomeMath (Point2 collection) // multiple

最好使用单个实现。

对于集合,我计划使用IEnumerable类型,因此我可以传递任何类型的集合,但对于单个值,我不想将其包装并作为集合传递,因为集合本身没有用处,除了满足类型。

如何以最清晰,最快速,最有效的方式处理它?<​​/ p>

编辑:也许我应该选择一个更好的方法名称,但是该方法计算所有点的平均值,对于1值没有意义,但将其视为该值将用于表示计算另一个值,但重要的是找到平均值,所以我不能称之为第一种方法。

3 个答案:

答案 0 :(得分:9)

写两个方法

  • AverageAndDoSomeMath(Point2 point)
  • AverageAndDoSomeMath(IEnumerable&lt; Point2&gt; points)

并将第一个通过将其包装在一个集合中来调用第二个。

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关于如何做标准偏差的事。