DISABLE ADBLOCK

ADBlock está bloqueando parte del contenido en el sitio

ADBlock errore
resultados encontrados: 

Pregunta

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

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

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

Solución

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

Si te gusta déjanos tu opinión

¿Fue útil el artículo y está traducido correctamente?

OTROS CONSEJOS

Yo diría, no te preocupes tanto por este micro desempeño. Es mucho mejor hacer que algo funcione, y luego hacerlo lo más claro y conciso y fácil de leer que sea 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 existe un problema de rendimiento real ... de lo contrario, pasará mucho tiempo en micro optimización y en realidad causará un aumento. 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, THEN es el momento de intentar averiguar cuál es la manera más rápida de resolver el problema. Creo que Jeff (y muchos otros) han escrito mucho sobre este tipo de cosas.

Obtendrá resultados diferentes 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 pruebe cada una de estas 10,000 veces y devuelva duraciones para cada una (pruebe cuándo o es un int y cuándo es otra cosa).

El método try-catch es el más rápido si el objeto mantiene un int, y por mucho el más lento si no lo hace (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, la comprobación de o is int toma el mismo tiempo que try-catch cuando o en realidad es un int. o is int es solo un poco más lento si o en realidad es otra cosa.

Molesto, FxCop lanzará advertencias si haces algo como:

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

Pero creo que es un error en FxCop. No sabe que int es un tipo de valor y le recomienda usar o como int en su lugar.

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

Como tienes una cadena, vería si necesitas saber que es un int, en lugar de un doble. Si int.TryParse se aprueba, también lo hará double.TryParse para que pueda la mitad del número de cheques: devolver el doble o la cadena y el doble de los pisos cuando se espera un int.

El problema que tienes 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 intenta hacer y de lo importante que es que sean de un tipo en particular. Podría ser mejor dejarlos como están tanto como pueda o, alternativamente, con un método para marcar cada uno (si tiene control de la fuente de la cadena original).

Personalmente uso int.tryparse, luego double.tryparse. El rendimiento en 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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow