Обощенная функция принимающая только числа
От: BlackEric http://black-eric.lj.ru
Дата: 18.08.19 19:23
Оценка:
В шарпе, пусть 7.3 можно как-то реализовать функцию:

public static T[] MyFunc<T>(T[] v) where T : int, decimal, double
{
  return v;
}
https://github.com/BlackEric001
Re: Обощенная функция принимающая только числа
От: Ночной Смотрящий Россия  
Дата: 18.08.19 19:38
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>В шарпе, пусть 7.3 можно как-то реализовать функцию:

BE>
BE>public static T[] MyFunc<T>(T[] v) where T : int, decimal, double
BE>{
BE>  return v;
BE>}
BE>


Нельзя. Задача то какая?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Обощенная функция принимающая только числа
От: BlackEric http://black-eric.lj.ru
Дата: 18.08.19 19:48
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, BlackEric, Вы писали:


BE>>В шарпе, пусть 7.3 можно как-то реализовать функцию:

BE>>
BE>>public static T[] MyFunc<T>(T[] v) where T : int, decimal, double
BE>>{
BE>>  return v;
BE>>}
BE>>


НС>Нельзя. Задача то какая?


Сортировка больших численных массивов.
https://github.com/BlackEric001
Re[3]: Обощенная функция принимающая только числа
От: Ночной Смотрящий Россия  
Дата: 18.08.19 20:20
Оценка: 6 (1) +2
Здравствуйте, BlackEric, Вы писали:

BE>Сортировка больших численных массивов.


Есть интерфейс IComparable<T>, его все числа реализуют.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: Обощенная функция принимающая только числа
От: _NN_ www.nemerleweb.com
Дата: 18.08.19 20:48
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>В шарпе, пусть 7.3 можно как-то реализовать функцию:


BE>
BE>public static T[] MyFunc<T>(T[] v) where T : int, decimal, double
BE>{
BE>  return v;
BE>}
BE>


Например сгенерировать код выражения (Expression) и его же запустить.
Как сделано здесь: https://github.com/rsdn/CodeJam/wiki/T_CodeJam_Arithmetic_Operators_1
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Обощенная функция принимающая только числа
От: ylem  
Дата: 18.08.19 21:08
Оценка:
BE>Сортировка больших численных массивов.

Настолько больших, что Array.Sort не вывозит?

where T : IComparable<T> не подходит тоже? Боксинга не будет (вроде бы).
Отредактировано 18.08.2019 23:34 ylem . Предыдущая версия .
Re[4]: Обощенная функция принимающая только числа
От: Sharov Россия  
Дата: 18.08.19 23:54
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Есть интерфейс IComparable<T>, его все числа реализуют.

Я бы еще struct добавил.
Кодом людям нужно помогать!
Re[2]: Обощенная функция принимающая только числа
От: VladCore  
Дата: 19.08.19 06:24
Оценка:
Здравствуйте, _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

Насколько я понял, автор вопроса хочет, что бы компилятор ругался, если T не входит в список из трех типов: int, decimal и double

для такого надо три функции написать для каждого типа или нагенерить их с помощью T4 в c# 7.*

В новом c# будут шейпы для этого. забыл как это перевели на русский.
Re[3]: Обощенная функция принимающая только числа
От: _NN_ www.nemerleweb.com
Дата: 19.08.19 06:30
Оценка: +1
Здравствуйте, VladCore, Вы писали:

VC> В новом c# будут шейпы для этого. забыл как это перевели на русский.

В новом это 8.0 или 9.0 ?

VC>для такого надо три функции написать для каждого типа или нагенерить их с помощью T4 в c# 7.*

Если надо, чтобы ругался компилятор то генерация и будет лучшим решением.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Обощенная функция принимающая только числа
От: BlackEric http://black-eric.lj.ru
Дата: 19.08.19 08:23
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, BlackEric, Вы писали:


BE>>Сортировка больших численных массивов.


НС>Есть интерфейс IComparable<T>, его все числа реализуют.


Точно. Этого будет достаточно. Вечером не сообразил. Спасибо.
https://github.com/BlackEric001
Re[3]: Обощенная функция принимающая только числа
От: BlackEric http://black-eric.lj.ru
Дата: 19.08.19 08:24
Оценка:
Здравствуйте, 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> хватит.
https://github.com/BlackEric001
Re[4]: Обощенная функция принимающая только числа
От: BlackEric http://black-eric.lj.ru
Дата: 19.08.19 08:25
Оценка:
Здравствуйте, ylem, Вы писали:

BE>>Сортировка больших численных массивов.


Y>Настолько больших, что Array.Sort не вывозит?


Y>where T : IComparable<T> не подходит тоже? Боксинга не будет (вроде бы).


Думаю, подойдет.
https://github.com/BlackEric001
Re[5]: Обощенная функция принимающая только числа
От: Ночной Смотрящий Россия  
Дата: 19.08.19 08:57
Оценка:
Здравствуйте, Sharov, Вы писали:

НС>>Есть интерфейс IComparable<T>, его все числа реализуют.

S>Я бы еще struct добавил.

Зачем?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[6]: Обощенная функция принимающая только числа
От: Sharov Россия  
Дата: 19.08.19 09:05
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Зачем?


Все числовые типы от структуры унаследованы.
Кодом людям нужно помогать!
Re[7]: Обощенная функция принимающая только числа
От: Ночной Смотрящий Россия  
Дата: 19.08.19 09:21
Оценка:
Здравствуйте, Sharov, Вы писали:

НС>>Зачем?

S> Все числовые типы от структуры унаследованы.

И?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: Обощенная функция принимающая только числа
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.08.19 09:35
Оценка:
Здравствуйте, BlackEric, Вы писали:

Возможно в будущем будут шейпы
https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/
и солнце б утром не вставало, когда бы не было меня
Re[8]: Обощенная функция принимающая только числа
От: Sharov Россия  
Дата: 19.08.19 09:55
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>И?


Для дополнительного ограничения на параметры типа.
Кодом людям нужно помогать!
Re[9]: Обощенная функция принимающая только числа
От: Ночной Смотрящий Россия  
Дата: 19.08.19 11:12
Оценка:
Здравствуйте, Sharov, Вы писали:

НС>>И?

S>Для дополнительного ограничения на параметры типа.

Зачем?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[5]: Обощенная функция принимающая только числа
От: samius Япония http://sams-tricks.blogspot.com
Дата: 19.08.19 13:33
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, ylem, Вы писали:


Y>>where T : IComparable<T> не подходит тоже? Боксинга не будет (вроде бы).


BE>Думаю, подойдет.


Если скорость выполнения важна, то это не лучший вариант. Нужно имитировать шейп.
Например, передать через Generic struct компаратор, в котором метод сравнения реализовать через оператор сравнения. Когда он заинлайнится, будет выполняться на голову быстрее, чем Compare. Сравнится с генерированным кодом.
Re[6]: Обощенная функция принимающая только числа
От: artelk  
Дата: 25.08.19 12:06
Оценка:
Здравствуйте, 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", то результат будет тот же. Надо тестировать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.