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

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

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

  1. Попробуйте конвертировать в int(а потом double). Если конвертация работает, возврат true. Если выдается исключение, вернитесь false.
  2. Регулярные выражения, предназначенные для соответствия шаблону intилиdouble
  3. Какой-то другой метод?
5.08.2008 07:49:11
5 ОТВЕТОВ
РЕШЕНИЕ

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

10
23.08.2012 20:15:36

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

3
5.08.2008 08:02:01

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

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

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

5
5.08.2008 08:04:22

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

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, а не double. Если int.TryParseпройдено, то так будет, double.TryParseчтобы вы могли вдвое сократить количество проверок - верните либо double, либо string и поставьте двойные, когда вы ожидаете int.

5
10.08.2008 17:43:14

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

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

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

5
23.09.2008 21:38:19
Конечной целью было попытаться определить наиболее эксклюзивный тип данных для объекта. 3 будет Int. 3,5 будет двойным. «Три» будет строкой. В конце концов я собрал функцию, которая пробовала несколько вызовов object.TryParse, пока она не смогла определить, какой тип данных «наиболее подходит».
Yaakov Ellis♦ 25.09.2008 14:06:44