Ответ 1
Будет использовать double.TryParse, он имеет преимущества производительности.
У меня есть значения, хранящиеся в виде строк в DataTable
, где каждое значение действительно может представлять собой int
, double
или string
(все они были преобразованы в строки во время процесса импорта из внешнего источника данных), Мне нужно проверить и посмотреть, какой тип действительно имеет значение.
Что более эффективно для приложения (или нет практических различий)?
int
(а затем double
). Если выполняется преобразование, возвращается true
. Если выбрано исключение, верните false
.int
или double
Будет использовать double.TryParse, он имеет преимущества производительности.
Я бы сказал, не беспокойтесь о такой микроэффективности. Гораздо лучше просто заставить что-то работать, а затем сделать его максимально понятным и лаконичным и легко читаемым. Самое худшее, что вы можете сделать, это удобство чтения для незначительного количества производительности.
В конце концов, лучший способ справиться с проблемами производительности - сохранить их, когда у вас есть данные, указывающие на реальную проблему с производительностью... в противном случае вы потратите много времени на микро-оптимизацию и на самом деле расходы на обслуживание на последующий период.
Если вы обнаружите, что эта ситуация синтаксического анализа действительно является узким местом в вашем приложении, ТОГДА стоит попробовать и выяснить, что самый быстрый способ решить проблему. Я думаю, что Джефф (и многие другие) очень много писали об этом.
Вы получите разные результаты для разных методов в зависимости от того, скомпилированы ли вы с оптимизацией. У вас в основном есть несколько вариантов:
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, а не двойной. Если int.TryParse
проходит, значит, будет double.TryParse
, чтобы вы могли получить половину числа проверок - верните либо double, либо string и наполните парные пары, когда вы ожидаете int.
Проблема заключается в том, что могут быть ситуации, когда ответом может быть все три типа.
3 может быть int, double или string!
Это зависит от того, что вы пытаетесь сделать и насколько важно, чтобы они были определенным типом. Лучше всего оставить их так, как вы можете, или, альтернативно, некоторые с помощью метода пометить каждый из них (если у вас есть контроль над исходной исходной строкой).
Я лично использовал int.tryparse, затем double.tryparse. Производительность по этим методам довольно быстрая. Оба возвращают булеву. Если оба сбой, то у вас есть строка, за то, как вы определили свои данные.