Почему C # не Math.Min / Max Variadic? - PullRequest
21 голосов
/ 15 марта 2012

Мне нужно найти минимум между 3 значениями, и в итоге я сделал что-то вроде этого:

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

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

Есть ли причина, по которой простая функция Мин / Макс не должна быть переменной? Есть ли последствия для производительности? Есть ли вариационная версия, которую я не заметил?

Ответы [ 3 ]

33 голосов
/ 15 марта 2012

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

9 голосов
/ 15 марта 2012

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

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

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

Во-вторых, как указал Эрик Липперт,Много раз языковые функции (и предположительно фреймворковые функции) не «удаляются» или активно исключаются - все функции не реализуются до тех пор, пока кто-то не разработает, не реализует, не тестирует, не документирует и не отправляет эту функцию. См. Здесь пример .

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

2 голосов
/ 15 марта 2012

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

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

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

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

...