Autor Beitrag
Oppi35
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Sa 26.06.10 14:10 
ausblenden volle Höhe 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;
            
            /*Die nächste Zeile dient nur als Hilfe zum Verstehen, was hier passiert*/
            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 user profile iconKha: C#-Tags hinzugefügt
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 26.06.10 15:56 
user profile iconOppi35 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconOppi35 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconOppi35 hat folgendes geschrieben Zum zitierten Posting springen:
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!
ausblenden 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
ausblenden 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.

user profile iconOppi35 hat folgendes geschrieben Zum zitierten Posting springen:
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 ist.

_________________
>λ=