2012-03-15 1 views
19

мне нужно найти минимум от 3 до значений, и я в конечном итоге делает что-то вроде этого:Почему нет C# Math.Min/Max variadic?

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

Это только кажется, немного глупо для меня, потому что другие языки используют VARIADIC функции для этого. Я очень сомневаюсь, что это был надзор.

Есть ли причина, почему простая функция Min/Max не является вариационной? Имеются ли последствия для производительности? Есть ли вариационная версия, которую я не заметил?

+2

не то, что вам нужно, но LINQ имеет расширение min для IEnumerable. –

+7

Вызов переменной функции выделяет массив. Это может считаться слишком большим накладным для простого min/max. – arx

ответ

30

Если это собрание (Подкласс 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, чтобы сделать жизнь некоторых программистам проще.

+0

-1 Этот ответ не устраивает характер вопроса. –

+2

Думаю, теперь это так, и большинство людей хотят прагматичного решения. Существуют и другие сайты обмена стеклом для теоретической информатики и парадигмы языка программирования. –

+1

@CommuSoft: Если он спросил, как это сделать, тогда ваш оригинальный ответ сработает, но он спросил, почему. В то время, когда вопрос должен быть задан, дискуссионный вопрос, как правило, допускаются абстрактные вопросы об определенных API, поскольку, очевидно, этот вопрос не является общим для компьютерной науки (хотя можно было бы изменить его как один ...) – Guvante

8

CommuSoft обратился к тому, как выполнить эквивалент в C#, поэтому я не буду r прочесть эту часть.

Чтобы конкретно рассмотреть ваш вопрос "Почему Math.Min/Max не является C#?", На ум приходят две мысли.

Во-первых, Math.Min (и Math.Max) на самом деле не является языковой функцией C#, это функция .NET framework library. Это может показаться педантичным, но это важное различие. На самом деле C# не предоставляет любую функцию языка специального назначения для определения минимального или максимального значения между двумя (или более) потенциальными значениями.

Во-вторых, как неоднократно указывал Эрик Липперт, языковые функции (и, предположительно, рамки) не «удаляются» или активно исключаются - все функции не выполняются, пока кто-то не проектирует, не реализует, не тестирует, не документирует и не отправляет особенность. See here for an example.

Не будучи разработчиком платформы .NET, я не могу говорить о фактическом процессе принятия решения, но это похоже на классический случай функции, которая просто никогда не поднималась до уровня включения, подобно последовательности foreach «Особенность» Эрик обсуждает в предоставленной ссылке.

+1

Да, это было немного педантично, но это то, чего я ожидаю от SO. Я знаю разницу между встроенным языком и библиотекой (я имею в виду, что вы написали имена в Math). Я должен был сказать .NET и Mono (две основные реализации, которые имеют почти идентичные стандартные библиотеки). Достойная связь, BTW. – tjameson

+0

@tjameson в этом случае, возможно, вы захотите изменить заголовок и тег на вопрос, поскольку, как вы заявляете, это не вопрос C#. Благодарю. – JeremyDWill

+0

Если это действительно вас беспокоит, продолжайте и отредактируйте его. Я не могу придумать способ включить .NET и Mono, не сделав заголовок супер длинным. Я думаю, что все в порядке. Я не знаю о реализации C#, которая не имеет эквивалентной функции в стандартной библиотеке. – tjameson

2

Я думаю, что CommuSoft предоставляет надежный ответ, который, по крайней мере, подходит для людей, которые ищут что-то в этом направлении, и это должно быть принято.

С учетом сказанного, причина, безусловно, чтобы избежать накладных расходов, необходимых для менее вероятно прецеденту, что люди хотят, чтобы сравнить группу, а не двух значений.

Как указано в @arx, использование параметрической системы было бы излишним накладным расходами для наиболее часто используемого случая, но также было бы слишком много лишних накладных расходов в отношении цикла, который должен был бы использоваться внутри, чтобы пройти через массив n - 1 раз.

Я могу легко увидеть аргумент за создание метода в дополнение к базовой форме, но с LINQ, который больше не нужен.

Смежные вопросы