为什么不是C#的Math.Min / Max可变参数?

时间:2012-03-15 02:58:43

标签: c# variadic-functions

我需要找到3个值之间的最小值,最后我做了类似的事情:

Math.Min(Math.Min(val1, val2), val3)

对我来说这似乎有点傻,因为其他语言使用可变函数。我非常怀疑这是一个疏忽。

有什么理由说明简单的Min / Max函数不是变量的吗?是否有性能影响?有没有我没注意到的可变版本?

3 个答案:

答案 0 :(得分:33)

如果它是一个集合(IEnumerable<T>的子类),可以轻松使用System.Linq库中的函数

int min = new int[] {2,3,4,8}.Min();

此外,您可以自己轻松实现这些方法:

public static class Maths {

    public static T Min<T> (params T[] vals) {
        return vals.Min();
    }
    public static T Max<T> (params T[] vals) {
        return vals.Max();
    }

}

您可以使用简单的标量来调用这些方法,因此Maths.Min(14,25,13,2)会给2

这些是通用方法,因此无需为每种类型的数字实现此方法(intfloat,...)

我认为这些方法一般未实现的基本原因是,每次调用此方法时,都应创建一个数组(或至少一个IList对象)。通过保持低级方法,可以避免开销。但是,我同意可以将这些方法添加到Math类中,以使一些程序员的生活更轻松。

答案 1 :(得分:9)

CommuSoft已经解决了如何在C#中完成等效的工作,所以我不会翻阅那部分内容。

要专门解答您的问题“为什么不是C#的Math.Min / Max可变参数?”,我会想到两个想法。

首先,Math.Min(和Math.Max)实际上不是C#语言特性,它是一个.NET框架库特性。这可能看起来很迂腐,但这是一个重要的区别。事实上,C#不提供任何专用语言功能来确定两个(或更多)潜在值之间的最小值或最大值。

其次,正如Eric Lippert多次指出的那样,语言功能(可能是框架功能)没有被“删除”或被主动排除 - 所有功能都没有实现,直到有人设计,实现,测试,记录和发布功能。 See here for an example

不是.NET框架开发人员,我不能谈论发生的实际决策过程,但似乎这是一个功能的经典案例,它根本没有上升到包含的水平,类似于序列foreach“功能“Eric在提供的链接中讨论。

答案 2 :(得分:2)

我认为CommuSoft提供了一个强有力的答案,至少适合那些在这些方面寻找某些东西的人,这应该被接受。

话虽如此,原因绝对是为了避免人们想要比较一个组而不是两个值的 less 可能的用例所需的开销。

正如@arx所指出的那样,对于最常用的情况,使用参数将是不必要的开销,但是对于必须在内部使用以通过数组的循环而言,它也将是很多不必要的开销。 n - 1次。

除了基本形式之外,我可以很容易地看到创建方法的参数,但是LINQ就不再需要了。