Здравствуйте, VladCore, Вы писали:
VC> В новом c# будут шейпы для этого. забыл как это перевели на русский.
В новом это 8.0 или 9.0 ?
VC>для такого надо три функции написать для каждого типа или нагенерить их с помощью T4 в c# 7.*
Если надо, чтобы ругался компилятор то генерация и будет лучшим решением.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, BlackEric, Вы писали:
BE>>Сортировка больших численных массивов.
НС>Есть интерфейс IComparable<T>, его все числа реализуют.
Точно. Этого будет достаточно. Вечером не сообразил. Спасибо.
Здравствуйте, VladCore, Вы писали:
VC>Здравствуйте, _NN_, Вы писали:
BE>>>В шарпе, пусть 7.3 можно как-то реализовать функцию:
BE>>>
BE>>>public static T[] MyFunc<T>(T[] v) where T : int, decimal, double
BE>>>{
BE>>> return v;
BE>>>}
BE>>>
_NN>>Например сгенерировать код выражения (Expression) и его же запустить. _NN>>Как сделано здесь: https://github.com/rsdn/CodeJam/wiki/T_CodeJam_Arithmetic_Operators_1
VC>Насколько я понял, автор вопроса хочет, что бы компилятор ругался, если T не входит в список из трех типов: int, decimal и double
VC>для такого надо три функции написать для каждого типа или нагенерить их с помощью T4 в c# 7.*
VC>В новом c# будут шейпы для этого. забыл как это перевели на русский.
Спасибо, посмотрю генерацию, но думаю что where T : IComparable<T> хватит.
Здравствуйте, ylem, Вы писали:
BE>>Сортировка больших численных массивов.
Y>Настолько больших, что Array.Sort не вывозит?
Y>where T : IComparable<T> не подходит тоже? Боксинга не будет (вроде бы).
Здравствуйте, BlackEric, Вы писали:
BE>Здравствуйте, ylem, Вы писали:
Y>>where T : IComparable<T> не подходит тоже? Боксинга не будет (вроде бы).
BE>Думаю, подойдет.
Если скорость выполнения важна, то это не лучший вариант. Нужно имитировать шейп.
Например, передать через Generic struct компаратор, в котором метод сравнения реализовать через оператор сравнения. Когда он заинлайнится, будет выполняться на голову быстрее, чем Compare. Сравнится с генерированным кодом.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, BlackEric, Вы писали:
BE>>Здравствуйте, ylem, Вы писали:
Y>>>where T : IComparable<T> не подходит тоже? Боксинга не будет (вроде бы).
BE>>Думаю, подойдет.
S>Если скорость выполнения важна, то это не лучший вариант. Нужно имитировать шейп. S>Например, передать через Generic struct компаратор, в котором метод сравнения реализовать через оператор сравнения. Когда он заинлайнится, будет выполняться на голову быстрее, чем Compare. Сравнится с генерированным кодом.
Если T структура, то CompareTo будет вызываться напрямую, а не через интерфейс. Если он еще и заинлайнится и оптимизатор сможет упростить условия вида "(x<y ? -1 : (x>y ? 1 : 0)) < 0" до "x<y", то результат будет тот же. Надо тестировать.