2008-08-05 7 views
16

Tengo valores almacenados como cadenas en un DataTable donde cada valor realmente podría representar un int, double o string (todos fueron convertidos a cadenas durante un proceso de importación desde una fuente de datos externa). Necesito probar y ver qué tipo es cada valor realmente.forma más eficaz de prueba de tipo de objeto

¿Qué es más eficiente para la aplicación (o no hay diferencia práctica)?

  1. tratar de convertir a int (y luego double). Si la conversión funciona, la devolución true. Si se lanza una excepción, devuelva false.
  2. Expresiones regulares diseñadas para que coincida con el patrón de int o double
  3. ¿Algún otro método?

Respuesta

9

Usaría double.TryParse, tiene beneficios de rendimiento.

3

Yo personalmente usaría int.tryparse, luego double.tryparse. El rendimiento en esos métodos es bastante rápido. Ambos devuelven un booleano. Si ambas fallas, entonces tienes una cadena, por la forma en que definiste tus datos.

6

Yo diría que no se preocupe tanto por ese micro rendimiento. Es mucho mejor hacer que algo funcione, y luego hacerlo lo más claro y conciso y fácil de leer posible. Lo peor que puedes hacer es sacrificar la legibilidad por una cantidad insignificante de rendimiento.

Al final, la mejor manera de lidiar con los problemas de rendimiento es guardarlos para cuando tenga datos que indiquen que hay un problema real de rendimiento ... de lo contrario pasará mucho tiempo micro-optimizando y en realidad causará mayores costos de mantenimiento para más adelante.

Si encuentra que esta situación de análisis es realmente el cuello de botella en su aplicación, ENTONCES es el momento de intentar averiguar cuál es la forma más rápida de resolver el problema. Creo que Jeff (y muchos otros) han escrito mucho sobre este tipo de cosas.

5

Obtendrá diferentes resultados para los diferentes métodos dependiendo de si compila con optimizaciones en. Es, básicamente, tiene algunas opciones:

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) 

Puede configurar fácilmente una aplicación de consola que trata cada uno de estos 10.000 veces y devuelve duraciones para cada (prueba cuando o es un entero y cuando es el algo más).

El método try-catch es el más rápido si el objeto contiene un int, y de lejos el más lento si no lo tiene (incluso más lento que GetType). int.TryParse es bastante rápido si tiene una cadena, pero si tiene un objeto desconocido es más lento.

Curiosamente, con .Net 3.5 y las optimizaciones activadas, la comprobación o is int lleva el mismo tiempo que try-catch cuando o en realidad es una int. o is int es solo un poco más lento si o realmente es otra cosa.

Irritantemente FxCop se rasguen las advertencias si haces algo como:

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

Pero creo que es un error en FxCop - que no sabe int es un tipo de valor y recomienda su uso o as int lugar.

Si su entrada es siempre una cadena int.TryParse es lo mejor, de lo contrario, el operador is es el más rápido.

Como tiene una cadena, miraría si necesita saber que es una int, en lugar de un doble. Si pasa int.TryParse, también lo hará double.TryParse, por lo que podría obtenerse la mitad del número de comprobaciones - devuelva el doble o la cadena y el doble cuando espera una int.

5

El problema es que podría haber situaciones en las que la respuesta podría ser de los tres tipos.

3 podría ser un int, un doble o una cadena!

Depende de lo que intente hacer y de la importancia de que sean de un tipo particular. Lo mejor sería dejarlos tal como están, siempre que sea posible o, alternativamente, usar un método para marcar cada uno (si tiene control de la fuente de la cadena original).

+0

El objetivo final era tratar de determinar el tipo de datos más exclusivo para el objeto. 3 sería un int. 3.5 sería un doble. "Tres" sería una cadena. Eventualmente, armé una función que probó un montón de objetos. Intentó llamar hasta que pudiera determinar cuál era el tipo de datos "mejor ajustado". –

Cuestiones relacionadas