Nejefektivnější způsob, jak otestovat typ objektu

hlasů
17

Mám hodnoty uložené jako řetězce v A DataTable, kde by každá hodnota ve skutečnosti znamenají int, doublenebo string(všechny byly převedeny na řetězce během importu z externího zdroje dat). Musím otestovat a zjistit, jaký typ každá hodnota ve skutečnosti je.

Co je účinnější pro aplikaci (nebo není tam žádný praktický rozdíl)?

  1. Pokusit převést na int(a double). V případě konverze práce, návrat true. Pokud je vyvolána výjimka, návrat false.
  2. Regulární výrazy, jejichž cílem je přizpůsobit tvaru písmene intOrdouble
  3. Nějaký jiný způsob?
Položena 05/08/2008 v 08:49
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
9

Bude používat double.TryParse, to má výhody výkonu.

Odpovězeno 05/08/2008 v 08:54
zdroj uživatelem

hlasů
6

Řekl bych, nebojte se tolik o takové mikro výkon. Je mnohem lepší, aby prostě dát něco do práce a pak se to tak jasné a stručné a snadno čitelné, jak je to možné. Nejhorší, co můžete udělat, je oběť čitelnost za nevýznamné množství výkonů.

V závěru, že nejlepší způsob, jak řešit problémy s výkonem je, aby je zachránil, když máte údaje, které prokazují, že je skutečný výkon problém ... jinak budete trávit hodně času mikro-optimalizaci a skutečně způsobit vyšší náklady na údržbu později.

Pokud zjistíte analýze situace je skutečně překážkou ve vaší žádosti, je tedy čas, aby se pokusila zjistit, co je nejrychlejší způsob, jak vyřešit tento problém je. Myslím, že Jeff (a mnoho dalších) se blogged o těchto věcech hodně.

Odpovězeno 05/08/2008 v 09:04
zdroj uživatelem

hlasů
5

Potíž máte, je, že by mohla nastat situace, kdy je odpověď by mohla být všechny tři typy.

3 by mohlo být int, double nebo řetězec!

Záleží na tom, co se snažíte dělat a jak důležité je, že se jedná o určitý druh. Mohlo by to být nejlepší jen nechat tak, jak jsou, pokud je to možné, nebo alternativně, některé až s metodou u příležitosti každé z nich (pokud máte kontrolu nad zdroji původní řetězec).

Odpovězeno 23/09/2008 v 22:38
zdroj uživatelem

hlasů
5

Dostanete různé výsledky pro různé metody v závislosti na tom, zda kompilace s optimalizací dále. Ty v podstatě mají několik možností:

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 )

Můžete snadno nastavit aplikaci konzoly, který se snaží každý z těchto 10.000 krát a vrací trvání každého testu (pokud o je int, a když je to něco jiného).

try-catchMetoda je nejrychlejší v případě, že objekt nemá držet int, a zdaleka nejpomalejší pokud tomu tak není (ještě pomalejší než GetType). int.TryParseJe docela rychle, pokud máte řetězec, ale pokud máte neznámého objektu je to pomalejší.

Je zajímavé, že se .Net 3.5 a optimalizace zapnuta o is intšeku trvá stejnou dobu jako try-catchkdyž o skutečnosti je int. o is intJe jen o něco pomalejší, pokud o skutečnosti je něco jiného.

Protivně FxCop bude hodit up varování, když se něco takového:

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

Ale myslím, že je chyba v FxCop - neví int je hodnota typu a doporučuje se používat o as intmísto.

Pokud váš vstup je vždy řetězec int.TryParseje nejlepší, jinak isprovozovatel je nejrychlejší.

Pokud máte řetězec jsem se podívat na to, zda je třeba vědět, že je to int, spíše než double. Pokud int.TryParseprojde pak tak bude double.TryParse, takže si mohl poloviční počet kontrol - vrátit buď dvoulůžkové nebo řetězec a podlahu ve čtyřhře, když čekáte int.

Odpovězeno 10/08/2008 v 18:43
zdroj uživatelem

hlasů
3

Já bych osobně používám int.tryparse pak double.tryparse. Účinností na těchto metod je poměrně rychlá. Oba vrátí booleovskou. Pokud jsou oba selžou, pak máte řetězec, na tom, jak je definováno svá data.

Odpovězeno 05/08/2008 v 09:02
zdroj uživatelem

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