我需要找到3个值之间的最小值,最后我做了类似的事情:
Math.Min(Math.Min(val1, val2), val3)
对我来说这似乎有点傻,因为其他语言使用可变函数。我非常怀疑这是一个疏忽。
有什么理由说明简单的Min / Max函数不是变量的吗?是否有性能影响?有没有我没注意到的可变版本?
答案 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
。
这些是通用方法,因此无需为每种类型的数字实现此方法(int
,float
,...)
我认为这些方法一般未实现的基本原因是,每次调用此方法时,都应创建一个数组(或至少一个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就不再需要了。