Самый эффективный способ проверить тип объекта
У меня есть значения, хранящиеся в виде строк в DataTable
где каждое значение может действительно представлять int
, double
, или же string
(все они были преобразованы в строки во время процесса импорта из внешнего источника данных). Мне нужно проверить и посмотреть, какой тип каждого значения на самом деле.
Что более эффективно для приложения (или нет практической разницы)?
- Попробуйте конвертировать в
int
(а потомdouble
). Если конвертация работает, возвратtrue
, Если выдается исключение, вернутьfalse
, - Регулярные выражения, предназначенные для соответствия шаблону
int
или жеdouble
- Какой-то другой метод?
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. Производительность по этим методам довольно быстрая. Они оба возвращают логическое значение. Если оба сбоя, то у вас есть строка, в соответствии с тем, как вы определили свои данные.