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

голоса
17

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

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

  1. Попробуйте преобразовать int(а затем double). Если конверсионные работы, возвращение true. Если исключение, вернуться false.
  2. Регулярные выражения , разработанные , чтобы соответствовать образцу с intО.Р.double
  3. Некоторые другие методы?
Задан 05/08/2008 в 08:49
источник пользователем
На других языках...                            


5 ответов

голоса
9

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

Ответил 05/08/2008 в 08:54
источник пользователем

голоса
6

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

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

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

Ответил 05/08/2008 в 09:04
источник пользователем

голоса
5

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

3 может быть INT, двойной или строка!

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

Ответил 23/09/2008 в 22:38
источник пользователем

голоса
5

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

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 раз и возвращает продолжительность для каждого (испытания, когда о является ИНТ и когда это что-то другое).

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

Интересно, что с .Net 3.5 и оптимизаций включил o is intпроверку занимает такое же время , как , try-catchкогда на самом деле о является внутр. o is intлишь немного медленнее , если о на самом деле что - то другое.

Досадно FxCop подбросит предупреждения, если вы делаете что-то вроде:

if( o is int )
    int j = (int) o;

Но я думаю , что это ошибка в FxCop - он не знает , ИНТ является типом значения , и рекомендует использовать o as intвместо этого.

Если ваш вход всегда является строкой int.TryParseлучше всего, в противном случае isоператор быстрый.

Как у вас есть строка , я хотел бы посмотреть на нужно ли знать , что это INT, а не в два раза. Если int.TryParseпроходит , то так будет , double.TryParseчтобы вы могли половину количество проверок - возвращать либо двойной или строку и пол двойников , когда вы ожидаете Int.

Ответил 10/08/2008 в 18:43
источник пользователем

голоса
3

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

Ответил 05/08/2008 в 09:02
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more