Oppi35 - Sa 26.06.10 14:10
Titel: Array sortieren; Methode: Compare to;Schnittst. ICompareable
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { person[] a = new person[3];
for (int i = 0; i < 3; i++) { a[i] = new person(); } a[0].Name = "Frank"; a[1].Name = "Stefan"; a[2].Name = "Klaus";
Console.WriteLine("Test Array Anlage manuell; Ausgabe sortiert"); Array.Sort(a);
foreach (person b in a) { Console.WriteLine(b.Name.ToString()); }
} }
class person: IComparable { public string Name; public person() {}
public int CompareTo(object obj) { person pers1 = obj as person; Console.WriteLine(this.Name.CompareTo(pers1.Name).ToString());
return this.Name.CompareTo(pers1.Name); } } } |
Ich habe eine Frage zu der "Compare To" Methode.
Durch den Aufruf Array.Sort(a) in der Program Klasse soll das Array sortiert werden. Ich verstehe das ganze so, dass die Array Klasse in ihrer Sort Methode nach der Methode "Compare To" sucht, in der eine Sortierregel "hinterlegt" ist.
Die Sortierung erfolgt nach einigen Anleitungen so, dass entweder -1, 0 oder 1 aus der Compare To Methode zurückgegeben wird, um anzugeben, ob der aktuelle Wert höher oder niedriger ist, als der übergebene Wert. In vielen Anleitungen zu dieser Methode enthalten auch die return Anweisungen die Werte -1, 0 oder 1.
In dem vorliegenden Beispiel steht allerdings eine return Anweisung, bei der mir nicht klar ist, was das genau passiert. Diese return Anweisung ist übrigens analog eines Beispiels aus der MSDN Library; und das Programm funktioniert auch so.
In der Return Anweisung wird doch die Compare To Methode wieder selbst aufgerufen, warum?
Um zu sehen, was hier zurückgegeben wird, habe ich die Console.Writeline Methode eingefügt. Es wird folg. in diesem Prog zurückgegeben:
-1
-1
1
-1
-1
Zum einen verstehe ich nicht, warum bzw. wie es hier zu diesen Zahlenwerten kommt; zum anderen würde mich interessieren, was hier genau in welcher Reihenfolge passiert, also warum hier 5 Werte zurückgegeben werden bei 3 Array Elementen.
Für Eure Hilfe schon vorab Vielen Dank.
Frank
Moderiert von
Kha: C#-Tags hinzugefügt
Kha - Sa 26.06.10 15:56
Oppi35 hat folgendes geschrieben : |
| Ich verstehe das ganze so, dass die Array Klasse in ihrer Sort Methode nach der Methode "Compare To" sucht, in der eine Sortierregel "hinterlegt" ist. |
Das "sucht" trifft es nicht genau, MSDN sagt dazu:
| Zitat: |
| Each element of array must implement the IComparable<T> generic interface to be capable of comparisons with every other element in array. |
Wobei dein Quelltext zeigt, dass auch
IComparable genügt ;) . Die generische Variante ist aber natürlich vorzuziehen.
Oppi35 hat folgendes geschrieben : |
| In dem vorliegenden Beispiel steht allerdings eine return Anweisung, bei der mir nicht klar ist, was das genau passiert. Diese return Anweisung ist übrigens analog eines Beispiels aus der MSDN Library; und das Programm funktioniert auch so. |
Ich hoffe aber, dass das
as nicht aus dem MSDN stammt, denn dort muss auf jeden Fall ein echter Cast
(Person) hin.
Oppi35 hat folgendes geschrieben : |
| In der Return Anweisung wird doch die Compare To Methode wieder selbst aufgerufen, warum? |
"Selbst" würde zu einer Endlosrekursion führen, aber es wird doch eine ganz andere Methode aufgerufen:
string.CompareTo!
C#-Quelltext
1: 2: 3: 4: 5: 6:
| > "a".CompareTo("b"); -1 > "a".CompareTo("a"); 0 > "b".CompareTo("a"); 1 |
Damit ist dein Quelltext gleichbedeutend mit
C#-Quelltext
1: 2: 3: 4: 5: 6:
| if (this.Name < pers1.Name) return -1; else if (this.Name == pers1.Name) return 0; else return 1; |
Soweit verständlich? Das Aggregat delegiert in seiner IComparable-Implementierung an die Implementierung eines Teils von ihm.
Oppi35 hat folgendes geschrieben : |
| zum anderen würde mich interessieren, was hier genau in welcher Reihenfolge passiert, also warum hier 5 Werte zurückgegeben werden bei 3 Array Elementen. |
Wie der Quicksort in der Array-Klasse genau aufgebaut ist, muss dich eigentlich nicht weiter interessieren. Wichtig ist, dass die Anzahl der Vergleiche genauso wie die Laufzeit im Average Case O(n log n) beträgt und Quicksort
instabil [
http://de.wikipedia.org/wiki/Instabiles_Sortierverfahren] ist.