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

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

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

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

 

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

 

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

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

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

 

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

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

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

 

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

```
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.

 

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