Forum » Programiranje » c# primerjava vrednosti dveh tipov object (brez da vem kateri tip sta)
c# primerjava vrednosti dveh tipov object (brez da vem kateri tip sta)
Vapo1 ::
bool Funkcija(object a, object b) { Type ta = a.GetType(); Type tb = b.GetType(); if (ta != tb) return false; if(a.GetType().IsValueType && b.GetType().IsValueType) return ValueType.Equals(a, b); else return false; }
ok... zgornja koda dela... torej kljuc je v funkciji ValueType.Equals() ki primerja objekte po vrednosti.... ok...
problem pa je ker bi rad te objekte v primeru da so istega value tipa primerjal tudi po velikosti.. .torej kateri je vecji in kateri manjsi.. in ne samo ce sta enaka....
ena opcija je da naredim miljardo if stavkov notri v smislu:
Type ta = a.GetType(); if(ta == typeof(int)) { if((int)a == (int)b) return 0; else if((int)a < (int)b) return -1; else if((int)a > (int)b) return 1; } if(ta == typeof(float)) { } . . . .
torej ce ima kdo kaksno bolj eleganto idejo
hvala
Vapo1 ::
ce objekt castam kot recimo int potem imam metodo compare to... ok.... ((int)a).compareTo...
ampak moj problem je da ce hocem castat objekt moram najprej preveriti katerega tipa je in potem moram napisati za vsak tip svoj if stavek
ampak moj problem je da ce hocem castat objekt moram najprej preveriti katerega tipa je in potem moram napisati za vsak tip svoj if stavek
if(ta == typeof(int)) { return ((int)a).compareTo((int)b); } if(ta == typeof(float)) { return ((float)a).compareTo((float)b); } .. . . in tako neskoncnokrat
Zgodovina sprememb…
- spremenilo: Vapo1 ()
darkolord ::
Mogoče kej tazga?
if (a.GetType().IsValueType && a is IComparable && a.GetType() == b.GetType()) { return ((IComparable)a).CompareTo(b); }
Zgodovina sprememb…
- spremenilo: darkolord ()
TopCat ::
Kaj takšnega?
if (a is IComparable) { return ((IComparable)a).CompareTo(b); }
Zgodovina sprememb…
- spremenil: TopCat ()
Vapo1 ::
ja... nekaj podobnega sem namutil sam.... ampak vase resitve so elegantnejse.... btw a vsi value tipi so IComprable al kako?
//ce pa ta objekt nima CompareTo metode potem vrne GetMethod null in najvrz to pomeni da se ga ne da comparat
Type ta = a.GetType(); MethodInfo MI_CompTo = ta.GetMethod("CompareTo"); if(MI_CompTo != null) { int rezultat = (int)MI_CompTo.Invoke(a, new object[] {b}); }
//ce pa ta objekt nima CompareTo metode potem vrne GetMethod null in najvrz to pomeni da se ga ne da comparat
fiction ::
AFAIK ni vsak ValueType primerljiv med sabo po velikosti. Oz. ti lahko najbrz tudi sam pogruntas nekaj, kar nima nekega vrstnega reda oz. urejanje ne bi imelo smisla. Vsi tipi, ki implementirajo IComparable so pac comparable.
Drugace je pomoje tvoja koda, ki uporablja reflection cisto enaka kot
tisto ko preveris if (tip is IComparable), le da je mogoce malo bolj obskurna (in najbrz - ne dam roke v ogenj za to, tudi pocasnejsa). Neke vrste duck-typing v stilu, ce obstaja CompareTo() metoda potem je ok.
Ampak problem je v tem, da lahko kje naletis tudi na kaksen drugacen CompareTo(). Tisto prvo je tako malo bolj "type safe".
Drugace je pomoje tvoja koda, ki uporablja reflection cisto enaka kot
tisto ko preveris if (tip is IComparable), le da je mogoce malo bolj obskurna (in najbrz - ne dam roke v ogenj za to, tudi pocasnejsa). Neke vrste duck-typing v stilu, ce obstaja CompareTo() metoda potem je ok.
Ampak problem je v tem, da lahko kje naletis tudi na kaksen drugacen CompareTo(). Tisto prvo je tako malo bolj "type safe".
darkolord ::
Vapo1: ta tvoj način uporablja reflection in je precej precej počasnejši od mojega (plus, tako kot je rekel fiction, lahko bi ta CompareTo metoda bila nekaj drugega in ne točno CompareTo metoda od IComparable interface-a)
Vapo1 ::
ja.. saj praivm da so vase resitve elegantnejse.... ta post me je privedel do tega da zdaj studiram kaj je to interface... lol.... do sedaj sem mislil da je IComprable nek base class...
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Naloga - programiranje v C#Oddelek: Šola | 983 (758) | Skaty |
» | [Java] Sortiranje razredovOddelek: Programiranje | 1433 (1180) | Spura |
» | [Java] Sortiranje objektovOddelek: Programiranje | 2800 (2800) | tjaz24 |
» | [Naloga][Java] UlomkiOddelek: Programiranje | 2644 (2492) | SkIDiver |
» | Java - sortiranje 2D tabeleOddelek: Programiranje | 1702 (1651) | SkIDiver |