Самый эффективный способ проверить тип объекта

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

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

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

5 ответов

Решение

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

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

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

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

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

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

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

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

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 )

Вы можете легко настроить консольное приложение, которое пробует каждое из этих 10000 раз и возвращает длительности для каждого (проверяйте, когда 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, и суммируйте double, когда вы ожидаете int.

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

Другие вопросы по тегам