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

bea*_*mit 21 c# variadic-functions

我需要找到3个值之间的最小值,我最终做了这样的事情:

Math.Min(Math.Min(val1, val2), val3)
Run Code Online (Sandbox Code Playgroud)

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

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

Wil*_*sem 33

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

int min = new int[] {2,3,4,8}.Min();
Run Code Online (Sandbox Code Playgroud)

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

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

您可以使用简单的标量来调用此方法,这样Maths.Min(14,25,13,2)就可以了2.

这些都是通用的方法,所以没有必要实施这种方法为每种类型的数字(int,float,...)

我想,为什么这些方法不是一般执行的根本原因是,每次调用此方法的阵列(或至少一个IList对象应该被创建.通过保持较低水平的方法之一可避免的开销.不过,我同意一个可以添加这些方法让Math班上的一些程序员的生活更加轻松.

  • @DJQuimby:为什么不写下自己喜欢的答案,而不是抱怨这个答案? (7认同)
  • 我认为现在确实如此,大多数人都想要一个务实的解决方案.还有其他用于理论计算机科学和编程语言范例的堆栈交换站点. (4认同)
  • 我说答案可能是使用数组或集合会降低方法的性能.如果我是正确的,方法甚至不存在.它们是低级代码的别名(例如80x86架构中的MINPS).我还提供了一种解决此问题的方法,而无需为每种类型的数字表示编写2个方法,因为大多数会发现此主题的人只是在寻找解决方案. (2认同)
  • 我想这是一个不错的答案.我更关注为什么C#没有实现它,但我想这是使用Linq解决的.谢谢(你的)信息! (2认同)

Jer*_*ill 9

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

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

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

其次,正如Eric Lippert多次指出的那样,语言功能(可能是框架功能)没有被"删除"或被主动排除 - 所有功能都没有实现,直到有人设计,实现,测试,记录和发布功能.请看这里的例子.

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