Najskuteczniejszym sposobem badanie typu Object

głosy
17

I ma wartości przechowywanych w napisów w DataTablektórym każda wartość może rzeczywiście stanowią int, doublelub string(wszystkie były przekształcane na łańcuchy podczas procesu importu z zewnętrznego źródła danych). Muszę przetestować i zobaczyć, jaki rodzaj każda wartość jest naprawdę.

Co jest bardziej skuteczne dla aplikacji (lub ma tam praktyczna różnica)?

  1. Spróbuj przekonwertować do int(i double). W przypadku prac adaptacyjnych, powrót true. Jeśli jest wyjątek, powrót false.
  2. Wyrażenia regularne zaprojektowane, aby dopasować wzór na intOrdouble
  3. Jakiś inny sposób?
Utwórz 05/08/2008 o 08:49
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
9

Użyłby double.TryParse, ma korzyści z wydajnością.

Odpowiedział 05/08/2008 o 08:54
źródło użytkownik

głosy
6

Powiedziałbym, nie martw się tak wiele o takim mikro wydajności. Jest o wiele lepiej po prostu coś do pracy, a następnie zrobić to tak jasne i zwięzłe i łatwe do odczytu, jak to możliwe. Najgorszą rzeczą, jaką możesz zrobić, to ofiara czytelność dla nieznacznej ilości wydajności.

W końcu, najlepszym sposobem radzenia sobie z problemów z wydajnością jest, aby zapisać je na kiedy masz dane, które wskazuje, że jest to rzeczywisty problem, wydajność ... inaczej będzie poświęcić dużo czasu mikro optymalizacji i faktycznie powoduje wyższe koszty utrzymania później.

Jeśli okaże się to sytuacja parsowanie jest naprawdę wąskie gardło w aplikacji, więc jest czas, aby spróbować dowiedzieć się, co to najszybszy sposób, aby rozwiązać problem. Myślę, że Jeff (i wiele innych), które napisał o tego typu rzeczy dużo.

Odpowiedział 05/08/2008 o 09:04
źródło użytkownik

głosy
5

Kłopot masz to, że mogą istnieć sytuacje, gdy odpowiedź mogłaby być wszystkie trzy typy.

3 może być int, podwójne lub ciąg!

To zależy od tego, co chce robić i jak ważne jest to, że są one określonego typu. To może być najlepiej po prostu zostawić je, ponieważ są one tak długo, jak to możliwe lub, alternatywnie, niektóre z metodą do oznaczania każdego z nich (jeśli masz kontrolę źródła oryginalnego napisu).

Odpowiedział 23/09/2008 o 22:38
źródło użytkownik

głosy
5

Dostaniesz różne wyniki dla różnych metod w zależności od tego, czy skompilować z optymalizacji dalej. W zasadzie masz kilka opcji:

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 )

Można łatwo skonfigurować aplikację konsoli, który próbuje każdego z tych 10.000 razy i zwraca trwania dla każdego testu (jeśli o to int a gdy jest to coś innego).

try-catchMetoda jest najszybsza jeśli obiekt ma posiadać int i zdecydowanie najwolniejszy jeśli nie (nawet wolniej niż GetType). int.TryParsejest dość szybkie, jeśli masz ciąg, ale jeśli masz nieznany obiekt to wolniej.

Co ciekawe, z .NET 3.5 i optymalizacji włączył o is intczeku trwa tyle samo czasu co try-catchgdy o faktycznie jest int. o is intjest tylko nieznacznie wolniejszy, jeśli rzeczywiście jest o coś innego.

Irytująco FxCop rzuci się ostrzeżenia, jeśli zrobisz coś takiego:

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

Ale myślę, że to błąd w FxCop - nie wiem, int jest typem wartości i zaleca używać o as intzamiast.

Jeśli wejście jest zawsze ciągiem int.TryParsejest najlepsze, w przeciwnym razie isoperator jest najszybsza.

Jak masz ciąg Chciałbym spojrzeć, czy musisz wiedzieć, że jest to int, a nie podwójne. Jeśli int.TryParseprzechodzi następnie tak będzie double.TryParsewięc można połowę liczby kontroli - powrót albo podwójne lub ciąg i podłogi deblu kiedy można oczekiwać int.

Odpowiedział 10/08/2008 o 18:43
źródło użytkownik

głosy
3

Chciałbym osobiście używać int.tryparse, następnie double.tryparse. Wyniki tych metod jest dość szybki. Oboje zwracają wartość logiczną. Jeśli oba nie wtedy masz ciąg, za, jak określono dane.

Odpowiedział 05/08/2008 o 09:02
źródło użytkownik

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