Pregunta

Tengo valores almacenados como cadenas en un DataTable donde cada valor realmente podría representar un int, double, o string (Todos se convirtieron en cadenas durante un proceso de importación desde una fuente de datos externa).Necesito probar y ver de qué tipo es realmente cada valor.

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

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

Solución

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

Otros consejos

Yo diría que no se preocupe tanto por ese microrendimiento.Es mucho mejor hacer que algo funcione y luego hacerlo lo más claro, conciso y fácil de leer posible.Lo peor que puede 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 de rendimiento real...de lo contrario, pasará mucho tiempo microoptimizando y, de hecho, generará mayores costos de mantenimiento para el futuro.

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 descubrir cuál es la forma más rápida de resolver el problema.Creo que Jeff (y muchos otros) han escrito mucho en blogs sobre este tipo de cosas.

Obtendrá diferentes resultados para los diferentes métodos dependiendo de si compila con optimizaciones activadas.Básicamente tienes 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 intente cada una de estas 10.000 veces y devuelva la duración de cada una (pruebe cuándo o es un int y cuándo es otra cosa).

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

Curiosamente, con .Net 3.5 y las optimizaciones activadas, o is int el cheque toma el mismo tiempo que try-catch cuando o en realidad es un int. o is int es sólo un poco más lento si o en realidad es otra cosa.

Es molesto que FxCop arroje advertencias si haces algo como:

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

Pero creo que eso es un error en FxCop: no sabe que int es un tipo de valor y recomienda usarlo o as int en cambio.

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

Como tienes una cadena, miraría si necesitas saber que es un int, en lugar de un doble.Si int.TryParse pasa entonces también lo hará double.TryParse por lo que podría reducir la mitad del número de comprobaciones: devolver doble o cadena y reducir los dobles cuando espere un int.

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

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

Depende de lo que intentes hacer y de lo importante que sea que sean de un tipo particular.Podría ser mejor dejarlos como están lo más largos posible o, alternativamente, idear un método para marcar cada uno (si tiene control de la fuente de la cadena original).

Yo personalmente usaría int.tryparse, luego double.tryparse.El rendimiento de esos métodos es bastante rápido.Ambos devuelven un booleano.Si ambos fallan, entonces tiene una cadena, según cómo definió sus datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top