Подтвердить что ты не робот

Наиболее эффективный способ тестирования типа объекта

У меня есть значения, хранящиеся в виде строк в DataTable, где каждое значение действительно может представлять собой int, double или string (все они были преобразованы в строки во время процесса импорта из внешнего источника данных), Мне нужно проверить и посмотреть, какой тип действительно имеет значение.

Что более эффективно для приложения (или нет практических различий)?

  • Попробуйте преобразовать в int (а затем double). Если выполняется преобразование, возвращается true. Если выбрано исключение, верните false.
  • Регулярные выражения, предназначенные для соответствия шаблону int или double
  • Другой метод?
4b9b3361

Ответ 1

Будет использовать double.TryParse, он имеет преимущества производительности.

Ответ 2

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

В конце концов, лучший способ справиться с проблемами производительности - сохранить их, когда у вас есть данные, указывающие на реальную проблему с производительностью... в противном случае вы потратите много времени на микро-оптимизацию и на самом деле расходы на обслуживание на последующий период.

Если вы обнаружите, что эта ситуация синтаксического анализа действительно является узким местом в вашем приложении, ТОГДА стоит попробовать и выяснить, что самый быстрый способ решить проблему. Я думаю, что Джефф (и многие другие) очень много писали об этом.

Ответ 3

Вы получите разные результаты для разных методов в зависимости от того, скомпилированы ли вы с оптимизацией. У вас в основном есть несколько вариантов:

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.

Ответ 4

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

3 может быть int, double или string!

Это зависит от того, что вы пытаетесь сделать и насколько важно, чтобы они были определенным типом. Лучше всего оставить их так, как вы можете, или, альтернативно, некоторые с помощью метода пометить каждый из них (если у вас есть контроль над исходной исходной строкой).

Ответ 5

Я лично использовал int.tryparse, затем double.tryparse. Производительность по этим методам довольно быстрая. Оба возвращают булеву. Если оба сбой, то у вас есть строка, за то, как вы определили свои данные.