La plupart moyen efficace pour tester le type d'objet

voix
17

J'ai des valeurs stockées sous forme de chaînes dans une DataTableoù chaque valeur pourrait vraiment représenter un int, doubleou string(ils ont tous été convertis en chaînes au cours d' un processus d'importation à partir d' une source de données externe). Je dois tester et voir quel type chaque valeur est vraiment.

Ce qui est plus efficace pour l'application (ou est pas de différence pratique là-bas)?

  1. Essayez de convertir int(puis double). Si les travaux de conversion, le retour true. Si une exception est levée, le retour false.
  2. Les expressions régulières conçues pour correspondre au modèle d'un intoudouble
  3. Une autre méthode?
Créé 05/08/2008 à 08:49
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
9

Utiliserait Double.TryParse, il a des avantages de performance.

Créé 05/08/2008 à 08:54
source utilisateur

voix
6

Je dirais, ne vous inquiétez pas tant sur ces micro performances. Il est préférable d'obtenir quelque chose à travailler, puis le rendre aussi clair et concis et facile à lire que possible. La pire chose que vous pouvez faire est la lisibilité de sacrifice pour une quantité non négligeable de la performance.

En fin de compte, la meilleure façon de traiter les problèmes de performance est de les sauver quand vous avez des données qui indique qu'il ya un problème de performances réelles ... sinon vous passerez beaucoup de micro-optimisation du temps et effectivement causer des coûts d'entretien plus élevés pour plus tard.

Si vous trouvez cette situation d'analyse syntaxique est vraiment le goulot d'étranglement dans votre application, est le temps d'essayer de comprendre ce que le meilleur moyen de résoudre le problème. Je pense que Jeff (et beaucoup d'autres) ont blogué sur ce genre de chose beaucoup.

Créé 05/08/2008 à 09:04
source utilisateur

voix
5

Le problème que vous avez est qu'il pourrait y avoir des situations où la réponse pourrait être les trois types.

3 pourrait être un entier, un double ou une chaîne!

Cela dépend de ce que vous essayez de faire et combien il est important qu'ils sont un type particulier. Il pourrait être préférable que de les laisser comme ils sont aussi longtemps que vous le pouvez, ou encore, certains avec une méthode pour marquer chacun (si vous avez le contrôle de la source de la chaîne d'origine).

Créé 23/09/2008 à 22:38
source utilisateur

voix
5

Vous obtiendrez des résultats différents pour les différentes méthodes selon que vous compilez avec Optimisations sur. Vous avez essentiellement quelques options:

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 )

Vous pouvez facilement configurer une application console qui essaie chacun de ces 10.000 fois et retourne des durées pour chaque (test lorsque o est un entier et quand il est autre chose).

La try-catchméthode est la plus rapide si l'objet ne détient un int, et de loin le plus lent si elle n'a pas (encore plus lent que GetType). int.TryParseest assez rapide si vous avez une chaîne, mais si vous avez un objet inconnu , il est plus lent.

Fait intéressant, avec .Net 3.5 et Optimisations activé le o is intcontrôle prend en même temps que try-catchquand o est en fait un int. o is intest seulement un peu plus lent si o est en fait autre chose.

Fâcheusement FxCop va vomir des avertissements si vous faites quelque chose comme:

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

Mais je pense que c'est un bogue dans FxCop - il ne sait pas int est un type de valeur et vous recommande d'utiliser à la o as intplace.

Si votre entrée est toujours une chaîne int.TryParseest la meilleure, sinon l' isopérateur est le plus rapide.

Comme vous avez une chaîne que je regarderais si vous avez besoin de savoir que c'est un entier, au lieu d'un double. Si int.TryParsepasse alors il en sera double.TryParseainsi vous pourriez la moitié du nombre de chèques - retour double ou chaîne et le plancher du double quand vous attendez un int.

Créé 10/08/2008 à 18:43
source utilisateur

voix
3

Personnellement, je l'utilise int.tryparse, puis Double.TryParse. Performance sur ces méthodes est assez rapide. Ils renvoient toutes les deux une valeur booléenne. Si les deux échouent alors vous avez une chaîne, par la façon dont vous avez défini vos données.

Créé 05/08/2008 à 09:02
source utilisateur

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