Πιο αποτελεσματικός τρόπος για να δοκιμάσετε Τύπος αντικειμένου

ψήφοι
17

Έχω τιμές αποθηκεύονται ως χορδές σε ένα DataTable, όπου κάθε τιμή θα μπορούσε πραγματικά να αντιπροσωπεύουν ένα int, doubleή string(ήταν όλοι μετατραπεί σε χορδές κατά τη διάρκεια μιας διαδικασίας εισαγωγής από μια εξωτερική πηγή δεδομένων). Πρέπει να δοκιμάσετε και να δούμε τι είδους κάθε τιμή είναι πραγματικά.

Ποια είναι η πιο αποτελεσματική για την εφαρμογή (ή δεν είναι πρακτική διαφορά υπάρχει);

  1. Προσπαθήστε να μετατρέψετε σε int(και στη συνέχεια double). Αν τα έργα μετατροπής, την επιστροφή true. Αν μια εξαίρεση, να επιστρέψει false.
  2. Κανονικές εκφράσεις σχεδιαστεί για να ταιριάζει με το μοτίβο ενός intήdouble
  3. Κάποια άλλη μέθοδο;
Δημοσιεύθηκε 05/08/2008 στις 08:49
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
9

Θα χρησιμοποιήσετε double.TryParse, έχει οφέλη απόδοσης.

Απαντήθηκε 05/08/2008 στις 08:54
πηγή χρήστη

ψήφοι
6

Θα ήθελα να πω, μην ανησυχείτε τόσο πολύ για τέτοιες μικρο απόδοση. Είναι πολύ καλύτερα να πάρετε απλά κάτι για να εργαστούν, και στη συνέχεια να είναι τόσο σαφή και συνοπτικό και εύκολο να το διαβάσετε όσο το δυνατόν. Το χειρότερο πράγμα που μπορείτε να κάνετε είναι θυσία αναγνωσιμότητα για ένα ασήμαντο ποσό των επιδόσεων.

Στο τέλος, ο καλύτερος τρόπος για να ασχοληθεί με τα ζητήματα επιδόσεων είναι να τους σώσει όταν έχετε στοιχεία που δείχνουν ότι υπάρχει ένα πραγματικό πρόβλημα απόδοσης ... διαφορετικά θα περάσετε πολύ χρόνο μικρο-βελτιστοποίηση και στην πραγματικότητα να προκαλέσει αύξηση του κόστους συντήρησης αργότερα.

Αν βρείτε αυτή η κατάσταση ανάλυσης είναι πραγματικά η δυσχέρεια στην εφαρμογή σας, τότε είναι η ώρα να δοκιμάσετε και να καταλάβω τι ο πιο γρήγορος τρόπος για να λυθεί το πρόβλημα. Νομίζω ότι ο Jeff (και πολλοί άλλοι) έχουν δημοσιεύσει σε blog σχετικά με αυτό το είδος του πράγματος πολλά.

Απαντήθηκε 05/08/2008 στις 09:04
πηγή χρήστη

ψήφοι
5

Το πρόβλημα που έχω είναι ότι θα μπορούσαν να υπάρξουν περιπτώσεις κατά τις οποίες η απάντηση θα μπορούσε να είναι και οι τρεις τύποι.

3 θα μπορούσε να είναι ένα int, ένα διπλό ή ένα string!

Εξαρτάται από το τι προσπαθείτε να κάνετε και πόσο σημαντικό είναι ότι είναι ένα συγκεκριμένο είδος. Θα μπορούσε να είναι καλύτερο απλά να τους αφήσουμε ως έχουν για όσο διάστημα μπορείτε ή, εναλλακτικά, κάποια με μια μέθοδο για να σηματοδοτήσει κάθε μία (αν έχετε τον έλεγχο της πηγής του αρχικού εγχόρδων).

Απαντήθηκε 23/09/2008 στις 22:38
πηγή χρήστη

ψήφοι
5

Θα έχετε διαφορετικά αποτελέσματα για τις διάφορες μεθόδους ανάλογα με το αν συγκεντρώνουν με βελτιστοποιήσεις για. Έχετε βασικά μερικές επιλογές:

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 )

Μπορείτε εύκολα να δημιουργήσει μια εφαρμογή κονσόλας που προσπαθεί κάθε μία από αυτές 10.000 φορές και επιστρέφει διάρκεια για κάθε (δοκιμή όταν ο είναι ένας int και όταν είναι κάτι άλλο).

Η try-catchμέθοδος είναι η γρηγορότερη αν το αντικείμενο έχει στην κατοχή του μια int, και μακράν ο πιο αργός αν δεν το κάνει (ακόμα πιο αργά από ό, τι GetType). int.TryParseείναι αρκετά γρήγορος, αν έχετε μια σειρά, αλλά εάν έχετε ένα άγνωστο αντικείμενο είναι πιο αργή.

Είναι ενδιαφέρον, με .Net 3.5 και βελτιστοποιήσεις ενεργοποιημένη την o is intεπιταγή παίρνει την ίδια στιγμή που try-catchόταν o πραγματικότητα είναι ένα int. o is intείναι μόνο ελαφρώς πιο αργό αν ο πραγματικά είναι κάτι άλλο.

Ενοχλητικά FxCop θα ρίξει μέχρι και τις προειδοποιήσεις αν κάνετε κάτι σαν:

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

Αλλά νομίζω ότι είναι ένα σφάλμα το οποίο FxCop - δεν γνωρίζει int είναι ένα είδος τιμής και συνιστά να χρησιμοποιήσετε o as intαντ 'αυτού.

Αν συμβολή σας είναι πάντα ένα string int.TryParseείναι το καλύτερο, διαφορετικά ο isχειριστής είναι πιο γρήγορος.

Όπως θα έχετε μια σειρά Θα δούμε αν θα πρέπει να γνωρίζετε ότι είναι ένα int, και όχι ένα διπλό. Αν int.TryParseπεράσματα τότε έτσι θα double.TryParseέτσι θα μπορούσε να το ήμισυ του αριθμού των ελέγχων - επιστρέφουν ένα διπλό ή κλωστή και το δάπεδο των διπλασιάζεται όταν περιμένεις μια int.

Απαντήθηκε 10/08/2008 στις 18:43
πηγή χρήστη

ψήφοι
3

Θα ήθελα προσωπικά να χρησιμοποιήσετε int.tryparse, τότε double.tryparse. Απόδοση σε αυτές τις μεθόδους είναι αρκετά γρήγορη. Και οι δύο επιστρέψει μια Boolean. Αν και οι δύο αποτύχουν τότε έχετε μια σειρά, ανά πώς ορίζονται τα δεδομένα σας.

Απαντήθηκε 05/08/2008 στις 09:02
πηγή χρήστη

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