Laden...

Warum ist Compare für versch. Typen unterschiedlich implementiert [war: Überfleißiger MS-Entwickler]

Erstellt von tkrasinger vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.106 Views
T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren
Warum ist Compare für versch. Typen unterschiedlich implementiert [war: Überfleißiger MS-Entwickler]

Na da war ja wohl jemand ganz übereifrig beim Entwickeln 😉

2.891 Beiträge seit 2004
vor 14 Jahren

Na da war ja wohl jemand ganz übereifrig beim Entwickeln 😉

Warum?

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren

Warum?

Hast wohl die Bilder in den Beiträgen ausgeschalten oder?

2.891 Beiträge seit 2004
vor 14 Jahren

Hast wohl die Bilder in den Beiträgen ausgeschalten oder?

Nö, ich sehe das Bild. Ich kann nur keinen Grund erkennen, warum da jemand übereifrig gewesen sein sollte...

Gruß,
dN!3L

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,

das Ergebnis ist - auch wenn du es anders erwartest - korrekt.

Siehe auch Compare-Methode

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren

Klar is alles korrekt, ich finds nur komisch dass der Comparer je nach Typ unterschiedliche Ergebnisse liefert, einmal einfach nur 1 oder -1 und bei allem was kleiner als ein int ist, den genauen unterschied.

2.891 Beiträge seit 2004
vor 14 Jahren

das Ergebnis ist - auch wenn du es anders erwartest - korrekt.

Eben. Wichtig beim Ergebnis der Compare-Methode ist einzig und allein das Vorzeichen (und ob es 0 ist). Alles Weitere ist internes Implementierungsdetail.
Und der einfachste Algorithmus ist "ersteZahl minus zweiteZahl". Also war der Entwickler bei Short eher faul. 😉 Oder bei den anderen drei Datentypen übereifrig... 🤔

Gruß,
dN!3L

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo tkrasinger,

kannst du nochmal ganz laaangsam, ausführlich und zum Mitschreiben erklären, was dein Problem ist? Und was das ganze mit dem Titel zu tun hat?

herbivore

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren

kannst du nochmal ganz laaangsam, ausführlich und zum Mitschreiben erklären, was dein Problem ist? Und was das ganze mit dem Titel zu tun hat?

vergiss es einfach und lösch den Thread. Ist nicht so angekommen wie ich dachte.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo tkrasinger,

ich finds nur komisch dass der Comparer je nach Typ unterschiedliche Ergebnisse liefert

naja, es gibt ja eine ganz logische Erklärung. Wie dN!3L schon sagt, will man Compare am liebsten und effizientesten als Rückgabe der Differenz der zu vergleichenden Werte implementieren. Nun ist aber der Rückgabetyp von Compare ein int. Die Differenz von zwei shorts passt immer in den Wertebereich eines ints. Die Differenz von zwei ints (longs, decimals) passt aber nicht immer in den Wertebereich eines ints. Deshalb kann man bei short die Implementierung mit der Differenz verwenden, aber bei int aber nicht.

Ist nicht so angekommen wie ich dachte.

Mir scheint, du hast diesen Umstand einfach übersehen und wolltest nun das dadurch für dich Unverständliche dem Entwickler anlasten, den wir hier aber eindeutig und nachdrücklich rehabilitieren müssen ...

lösch den Thread

... weshalb ich auch den Thread nicht sofort entfernen werde.

herbivore

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren

Mir scheint, du hast diesen Umstand einfach übersehen

Ja, das hab ich in dem Zusammenhang nicht bedacht, weil mir bis dato noch nie ein Comparer untergekommen ist der nicht -1, 0 oder 1 geliefert hat.

und wolltest nun das dadurch für dich Unverständliche dem Entwickler anlasten, den wir hier aber eindeutig und nachdrücklich rehabilitieren müssen ...

Nein das wollt ich sicher nicht, es is halt einfach nur komisch, von einer Compare-Methode die bei x-Datentypen immer nur 3 verschiedene Ergebnisse liefert, auf einmal was anders zu bekommen.

if( Comparer<A>.Default.Compare(a,b) == Comparer<B>.Default(c,d))

funktioniert nämlich nur solange A und B kleiner als int sind bzw. A und B größer gleich int sind. Ist A int und B short funktioniert der Vergleich nicht mehr.

In diese Falle bin ich eben geraten. Mein Fehler

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo tkrasinger,

so geht es in jedem Fall:

if(Math.Sign (Comparer<A>.Default.Compare(a,b)) == Math.Sign (Comparer<B>.Default(c,d)))

herbivore

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren

Ja klar, das hab ich dann ja auch gemacht, als ich gemerkt hatte, dass der short anders arbeitet.

PS: Mann könnte natürlich auch:
Comparer<int>.Default.Compare(Comparer<A>.Default.Compare(a,b),Comparer<B>.Default.Compare(c,d))

schreiben.