Сведения о вопросе

Kirushaa

16:03, 1st July, 2020

Теги

c#   .net   double   int    

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

Просмотров: 492   Ответов: 5

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

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

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



  Сведения об ответе

JUST___

18:03, 1st July, 2020

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


  Сведения об ответе

baggs

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

qwerty101

18:03, 1st July, 2020

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

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.


  Сведения об ответе

PROGA

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

PHPH

18:03, 1st July, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться