Question

J'ai valeurs stockées comme des chaînes de caractères dans un DataTable où chaque valeur peut vraiment représenter une int, double, ou string (ils étaient tous convertis à cordes lors d'un processus d'importation à partir d'une source de données externe).J'ai besoin de tester et de voir ce type de chaque valeur est vraiment.

Ce qui est plus efficace pour l'application (ou il n'y a pas de différence pratique)?

  1. Essayer de les convertir à int (et puis double).Si la conversion fonctionne, le retour true.Si une exception est levée, le retour false.
  2. Les expressions régulières conçu pour correspondre à la forme d'un int ou double
  3. Une autre méthode?
Était-ce utile?

La solution

Serait double.TryParse, il a des avantages de performance.

Autres conseils

Je dirais de ne pas trop s'inquiéter de ces micro de la performance.Il est beaucoup mieux de simplement obtenir quelque chose à travailler, et ensuite la rendre aussi claire et concise et facile à lire que possible.La pire chose que vous pouvez faire est de sacrifier la lisibilité pour une quantité insignifiante de la performance.

En fin de compte, la meilleure façon de traiter les problèmes de performance consiste à les enregistrer lorsque vous avez des données indique qu'il y a un réel problème de performance...sinon vous allez passer beaucoup de temps à micro-optimisation et effectivement causer des frais d'entretien pour plus tard.

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

Vous obtiendrez des résultats différents pour les différentes méthodes, selon que vous compilez avec des optimisations sur.En gros, vous avez 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 tente de chacune de ces 10 000 fois et les retours des durées pour chaque (test lorsque o est un int, et quand c'est autre chose).

L' try-catch la méthode est le moyen le plus rapide si l'objet contient un int, et de loin, le plus lent si ce n'est pas (encore plus lente que GetType). int.TryParse est assez rapide si vous avez une chaîne, mais si vous avez un objet inconnu, il est plus lent.

Il est intéressant de noter, avec .Net 3.5 et d'optimisation des tournées sur le o is int vérifiez prend le même temps que try-catch lorsque o est en fait un int. o is int est seulement légèrement plus lente si o est effectivement quelque chose d'autre.

Fâcheusement FxCop permettra de lancer des avertissements si vous faites quelque chose comme:

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

Mais je pense que c'est un bug dans FxCop - il ne sait pas int est un type de valeur et vous recommande d'utiliser o as int au lieu de cela.

Si votre entrée est toujours une chaîne de caractères int.TryParse est le meilleur, sinon le is l'opérateur est le plus rapide.

Comme vous avez une chaîne je regarderais si vous avez besoin de savoir que c'est un int, plutôt que d'un lit double.Si int.TryParse passe puis il en sera de double.TryParse vous pourriez donc à la moitié du nombre de chèques - retour d'un lit double ou de chaîne et le plancher de la double lorsque vous vous attendez à un int.

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

3 pourrait être un int, un lit double ou un string!

Il 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 de simplement les laisser comme ils sont, tant que vous pouvez ou, alternativement, une méthode pour marquer chacun (si vous avez le contrôle de la source de la chaîne d'origine).

Je serais personnellement utiliser int.tryparse, puis double.tryparse.Les performances sur ces méthodes est assez rapide.Ils renvoient 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top