c# - Méthode la plus efficace pour tester le type d'objet

Translate

J'ai des valeurs stockées sous forme de chaînes dans unDataTableoù chaque valeur pourrait vraiment représenter unint, double, oustring(ils ont tous été convertis en chaînes lors d'un processus d'importation à partir d'une source de données externe). J'ai besoin de tester et de voir quel type est réellement chaque valeur.

Qu'est-ce qui est le plus efficace pour l'application (ou n'y a-t-il pas de différence pratique)?

  1. Essayez de convertir enint(et alorsdouble). Si la conversion fonctionne, le retourtrue. Si une exception est levée, retournefalse.
  2. Expressions régulières conçues pour correspondre au modèle d'unintoudouble
  3. Une autre méthode?
This question and all comments follow the "Attribution Required."

Toutes les réponses

gil
Translate

Utiliserait double.TryParse, il présente des avantages en termes de performances.

La source
Translate

Je dirais, ne vous inquiétez pas tant de ces micro performances. Il est préférable de simplement faire fonctionner quelque chose, puis de le rendre aussi clair, concis et facile à lire que possible. La pire chose que vous puissiez faire est de sacrifier la lisibilité pour une quantité insignifiante de performances.

En fin de compte, la meilleure façon de traiter les problèmes de performances est de les enregistrer lorsque vous avez des données indiquant qu'il y a un problème de performances réel ... sinon vous passerez beaucoup de temps à micro-optimisation et entraîneriez des coûts de maintenance plus élevés pour plus tard.

Si vous trouvez que cette situation d'analyse est vraiment le goulot d'étranglement de votre application, ALORS il est temps d'essayer de trouver le moyen le plus rapide de résoudre le problème. Je pense que Jeff (et beaucoup d'autres) ont beaucoup blogué sur ce genre de choses.

La source
Translate

Vous obtiendrez des résultats différents pour les différentes méthodes selon que vous compilez avec les optimisations. 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 chacune de ces 10000 fois et renvoie des durées pour chacune (testez quand o est un int et quand c'est autre chose).

letry-catchest la plus rapide si l'objet contient un int, et de loin la plus lente si ce n'est pas le cas (encore plus lente queGetType).int.TryParseest assez rapide si vous avez une chaîne, mais si vous avez un objet inconnu, c'est plus lent.

Fait intéressant, avec .Net 3.5 et les optimisations activéeso is intla vérification prend le même temps quetry-catchquand o est en fait un int.o is intest seulement légèrement plus lent si o est en fait autre chose.

FxCop lancera 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 que int est un type valeur et vous recommande d'utilisero as intau lieu.

Si votre entrée est toujours une chaîneint.TryParseest le meilleur, sinon leisl'opérateur est le plus rapide.

Comme vous avez une chaîne, je vérifierais si vous avez besoin de savoir que c'est un int, plutôt qu'un double. Siint.TryParsepasse alors aussidouble.TryParsevous pouvez donc réduire de moitié le nombre de vérifications - renvoyer soit double ou chaîne et plancher les doubles lorsque vous attendez un int.

La source
Translate

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

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

Cela dépend de ce que vous essayez de faire et de l'importance du fait qu'ils soient d'un type particulier. Il pourrait être préférable de les laisser tels quels aussi longtemps que vous le pouvez ou, alternativement, certains avec une méthode pour marquer chacun d'eux (si vous avez le contrôle de la source de la chaîne d'origine).

La source
Translate

J'utiliserais personnellement int.tryparse, puis double.tryparse. Les performances sur ces méthodes sont assez rapides. Ils renvoient tous les deux un booléen. Si les deux échouent, vous avez une chaîne, selon la façon dont vous avez défini vos données.

La source