Самый эффективный способ проверить тип объекта - PullRequest
18 голосов
/ 05 августа 2008

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

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

  1. Попробуйте преобразовать в int (а затем double). Если преобразование работает, возврат true. Если выдается исключение, вернуть false.
  2. Регулярные выражения, предназначенные для соответствия шаблону int или double
  3. Какой-то другой метод?

Ответы [ 5 ]

9 голосов
/ 05 августа 2008

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

6 голосов
/ 05 августа 2008

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

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

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

5 голосов
/ 24 сентября 2008

Ваша проблема в том, что могут быть ситуации, когда ответом могут быть все три типа.

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

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

5 голосов
/ 10 августа 2008

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

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 является целым числом, а когда - чем-то другим).

Метод try-catch является самым быстрым, если объект действительно содержит int, и самым медленным, если он не имеет (даже медленнее, чем GetType). int.TryParse довольно быстро, если у вас есть строка, но если у вас есть неизвестный объект, он медленнее.

Интересно, что с включенным .Net 3.5 и оптимизацией проверка o is int занимает то же время, что и try-catch, когда o на самом деле является целым числом. 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 голосов
/ 05 августа 2008

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

...