Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Наиболее эффективный способ проверки типа объекта
У меня есть значения, сохраненные в виде строк в DataTable , где каждое значение действительно может представлять собой int , double или string (все они были преобразованы в строки во время процесса импорта из внешнего источника данных). Мне нужно проверить и посмотреть, какой тип на самом деле имеет каждое значение.
Что более эффективно для применения (или нет никакой практической разницы)?
- Попробуйте преобразовать его в
int(а затем вdouble). Если преобразование работает, то возвратtrue. Если возникает исключение, вернитеfalse. - Регулярные выражения, предназначенные для соответствия шаблону
intилиdouble - Какой-то другой метод?
Я бы сказал, что не стоит так сильно беспокоиться о такой микро-производительности. Гораздо лучше просто взять что-то на работу, а затем сделать это как можно более ясным, лаконичным и легким для чтения. Самое худшее, что вы можете сделать, - это пожертвовать удобочитаемостью ради незначительной производительности.
В конце концов, лучший способ справиться с проблемами производительности-это сохранить их для тех случаев, когда у вас есть данные, указывающие на фактическую проблему производительности... в противном случае вы потратите много времени на микро-оптимизацию и фактически вызовете более высокие затраты на техническое обслуживание в будущем.
Если вы обнаружите, что эта ситуация разбора действительно является узким местом в вашем приложении, THEN-это время, чтобы попытаться выяснить, какой самый быстрый способ решить эту проблему. Я думаю, что Джефф (и многие другие) много писал о таких вещах в блогах.
Вы получите разные результаты для разных методов в зависимости от того, будете ли вы компилировать с оптимизацией. У вас в основном есть несколько вариантов:
object o;
//checking with is
o is int
//check type
o.GetType() != typeof( int )
//cast and catch exception
try{ int j = (int) o; }
catch {}
//use the tryparse
int.TryParse( Convert.ToString( o ), out j )
Вы можете легко настроить консольное приложение, которое пробует каждый из этих 10 000 раз и возвращает длительность для каждого (тест, когда o-это int, а когда что-то другое).
Метод try-catch является самым быстрым, если объект действительно содержит int, и намного медленнее, если он этого не делает (даже медленнее, чем GetType ). int.TryParse -это довольно быстро, если у вас есть строка, но если у вас есть неизвестный объект, это медленнее.
Интересно, что при включении .Net 3.5 и оптимизации проверка o is int занимает столько же времени, сколько и проверка try-catch , когда o фактически является int. o is int только немного медленнее, если o на самом деле является чем-то другим.
Досадно FxCop будет выдавать предупреждения, если вы сделаете что-то вроде:
if( o is int )
int j = (int) o;
Но я думаю, что это ошибка в FxCop - он не знает, что int - это тип значения, и рекомендует вам использовать вместо него o as int .
Если вы всегда вводите строку int.TryParse -это лучше всего, в противном случае оператор is -самый быстрый.
Поскольку у вас есть строка, я бы посмотрел, нужно ли вам знать, что это int, а не double. Если int.TryParse проходит, то и double.TryParse будет таким же, так что вы можете вдвое сократить количество проверок-возвращать либо double, либо string и заполнять двойники, когда вы ожидаете int.
Проблема заключается в том, что могут возникнуть ситуации, когда ответом могут быть все три типа.
3 может быть int, double или string!
Это зависит от того, что вы пытаетесь сделать и насколько важно, чтобы они были определенного типа. Возможно, лучше всего просто оставить их такими, как они есть, до тех пор, пока вы можете или, как вариант, использовать метод, чтобы отметить каждый из них (если у вас есть контроль над источником исходной строки).