» »

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

mchaber ::

Mogoče, tako iz glave, metoda CompareTo.
.

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

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 ()

darkolord ::

Sam morš preverit vsaj še to, če sta enakega tipa...

Vapo1 ::

ja... nekaj podobnega sem namutil sam.... ampak vase resitve so elegantnejse.... btw a vsi value tipi so IComprable al kako?

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".

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...

Looooooka ::

ce pa delas z interfaci mas pol tle se IsAssignableFrom


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Naloga - programiranje v C#

Oddelek: Šola
8931 (706) Skaty
»

[Java] Sortiranje razredov

Oddelek: Programiranje
101349 (1096) Spura
»

[Java] Sortiranje objektov

Oddelek: Programiranje
192707 (2707) tjaz24
»

[Naloga][Java] Ulomki

Oddelek: Programiranje
62541 (2389) SkIDiver
»

Java - sortiranje 2D tabele

Oddelek: Programiranje
61642 (1591) SkIDiver

Več podobnih tem