0Pricing
C# Academy · Lektion

IComparable implementieren

Definieren Sie mit CompareTo eine natürliche Sortierreihenfolge.

IComparable implementieren ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Sortierung mit IComparable<T>

IComparable<T> definiert über eine einzige Methode, CompareTo, eine natürliche Reihenfolge für einen Typ. Nach der Implementierung kann Ihr Typ mit Array.Sort, List.Sort und sortierten Sammlungen sortiert werden.

Der CompareTo-Vertrag

CompareTo gibt eine negative Zahl zurück, wenn diese Instanz kleiner als die andere ist, null bei Gleichheit und eine positive Zahl, wenn sie größer ist. Häufig lässt sich dies direkt durch den Vergleich der zugrunde liegenden Werte implementieren.

using System;

public struct Weight : IComparable<Weight>
{
    public int Grams;
    public Weight(int g) { Grams = g; }

    public int CompareTo(Weight other) => Grams.CompareTo(other.Grams);

    public override string ToString() => Grams + "g";
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Weight(100).CompareTo(new Weight(200)));
        Console.WriteLine(new Weight(200).CompareTo(new Weight(200)));
        Console.WriteLine(new Weight(300).CompareTo(new Weight(200)));
    }
}

Eine Liste sortieren

Sobald ein Typ vergleichbar ist, ordnet List<T>.Sort() ihn mithilfe von CompareTo ohne zusätzliche Argumente.

using System;
using System.Collections.Generic;

public struct Weight : IComparable<Weight>
{
    public int Grams;
    public Weight(int g) { Grams = g; }
    public int CompareTo(Weight other) => Grams.CompareTo(other.Grams);
    public override string ToString() => Grams + "g";
}

public class Program
{
    public static void Main()
    {
        var list = new List<Weight> { new Weight(300), new Weight(100), new Weight(200) };
        list.Sort();
        Console.WriteLine(string.Join(", ", list));
    }
}

Nach einem primären Feld vergleichen

Wählen Sie bei einer Klasse das Feld aus, das ihre natürliche Reihenfolge bestimmt. Hier werden Personen nach Alter geordnet, wobei an int.CompareTo delegiert wird.

using System;
using System.Collections.Generic;

public class Person : IComparable<Person>
{
    public string Name;
    public int Age;
    public Person(string name, int age) { Name = name; Age = age; }
    public int CompareTo(Person other) => Age.CompareTo(other.Age);
    public override string ToString() => Name + "(" + Age + ")";
}

public class Program
{
    public static void Main()
    {
        var people = new List<Person> { new Person("Ann", 30), new Person("Bo", 20) };
        people.Sort();
        Console.WriteLine(string.Join(", ", people));
    }
}

Mehrere Felder als Tie-Breaker verwenden

Wenn der primäre Schlüssel gleich ist, vergleichen Sie ein sekundäres Feld. Führen Sie den ersten Vergleich durch und greifen Sie nur dann auf das nächste Feld zurück, wenn das Ergebnis null ist.

using System;
using System.Collections.Generic;

public class Person : IComparable<Person>
{
    public string Name;
    public int Age;
    public Person(string name, int age) { Name = name; Age = age; }
    public int CompareTo(Person other)
    {
        int byAge = Age.CompareTo(other.Age);
        return byAge != 0 ? byAge : string.Compare(Name, other.Name, StringComparison.Ordinal);
    }
    public override string ToString() => Name + "(" + Age + ")";
}

public class Program
{
    public static void Main()
    {
        var people = new List<Person> { new Person("Zoe", 30), new Person("Ann", 30) };
        people.Sort();
        Console.WriteLine(string.Join(", ", people));
    }
}

Arrays sortieren

Auch Array.Sort verwendet IComparable<T>. Dieselbe Vergleichslogik gilt gleichermaßen für Arrays, Listen und geordnete Strukturen.

using System;

public struct Score : IComparable<Score>
{
    public int Points;
    public Score(int p) { Points = p; }
    public int CompareTo(Score other) => Points.CompareTo(other.Points);
    public override string ToString() => Points.ToString();
}

public class Program
{
    public static void Main()
    {
        var scores = new[] { new Score(50), new Score(10), new Score(30) };
        Array.Sort(scores);
        Console.WriteLine(string.Join(", ", (object[])scores));
    }
}

Absteigende Reihenfolge

Um die Reihenfolge umzukehren, invertieren Sie den Vergleich, indem Sie die Operanden von CompareTo vertauschen. So können Sie ohne einen separaten Comparer von groß nach klein sortieren.

using System;
using System.Collections.Generic;

public struct Score : IComparable<Score>
{
    public int Points;
    public Score(int p) { Points = p; }
    // Reversed: higher points come first
    public int CompareTo(Score other) => other.Points.CompareTo(Points);
    public override string ToString() => Points.ToString();
}

public class Program
{
    public static void Main()
    {
        var list = new List<Score> { new Score(10), new Score(50), new Score(30) };
        list.Sort();
        Console.WriteLine(string.Join(", ", list));
    }
}

Comparable und Equatable gemeinsam verwenden

Wenn CompareTo null zurückgibt, gelten die Elemente hinsichtlich der Reihenfolge als gleich. Halten Sie dies mit Equals konsistent, damit Sortierung und Gleichheit übereinstimmen.

using System;

public struct Version : IComparable<Version>, IEquatable<Version>
{
    public int Major, Minor;
    public Version(int major, int minor) { Major = major; Minor = minor; }
    public int CompareTo(Version other)
    {
        int byMajor = Major.CompareTo(other.Major);
        return byMajor != 0 ? byMajor : Minor.CompareTo(other.Minor);
    }
    public bool Equals(Version other) => CompareTo(other) == 0;
    public override bool Equals(object obj) => obj is Version v && Equals(v);
    public override int GetHashCode() => HashCode.Combine(Major, Minor);
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Version(1, 2).CompareTo(new Version(1, 5)));
        Console.WriteLine(new Version(2, 0).Equals(new Version(2, 0)));
    }
}

Vergleiche in LINQ OrderBy verwenden

Auch ohne direkte Sortierung kann LINQ OrderBy Ihren vergleichbaren Typ über einen Schlüssel-Selektor verwenden und so verzögert eine sortierte Ansicht erzeugen.

using System;
using System.Collections.Generic;
using System.Linq;

public struct Weight : IComparable<Weight>
{
    public int Grams;
    public Weight(int g) { Grams = g; }
    public int CompareTo(Weight other) => Grams.CompareTo(other.Grams);
    public override string ToString() => Grams + "g";
}

public class Program
{
    public static void Main()
    {
        var items = new List<Weight> { new Weight(300), new Weight(100) };
        foreach (var w in items.OrderBy(x => x))
            Console.WriteLine(w);
    }
}

Ein sortierbarer Domänentyp

Die Implementierung von IComparable<T> macht aus einem Domänenkonzept etwas, das das gesamte Framework sortieren kann. Hier werden Aufgaben zuerst nach Priorität und dann nach Namen sortiert.

using System;
using System.Collections.Generic;

public class TaskItem : IComparable<TaskItem>
{
    public string Name;
    public int Priority;
    public TaskItem(string name, int priority) { Name = name; Priority = priority; }
    public int CompareTo(TaskItem other)
    {
        int byPriority = Priority.CompareTo(other.Priority);
        return byPriority != 0 ? byPriority : string.Compare(Name, other.Name, StringComparison.Ordinal);
    }
    public override string ToString() => Priority + ":" + Name;
}

public class Program
{
    public static void Main()
    {
        var tasks = new List<TaskItem>
        {
            new TaskItem("deploy", 2), new TaskItem("build", 1), new TaskItem("test", 1)
        };
        tasks.Sort();
        Console.WriteLine(string.Join(", ", tasks));
    }
}

Probieren Sie es selbst aus

Erstellen Sie einen vergleichbaren Typ mit mehreren Feldern und sortieren Sie eine Liste davon. Die natürliche Ordnung ergibt sich aus CompareTo, ganz ohne zusätzliche Argumente.

using System;
using System.Collections.Generic;

public class Card : IComparable<Card>
{
    public int Rank;
    public string Suit;
    public Card(int rank, string suit) { Rank = rank; Suit = suit; }
    public int CompareTo(Card other)
    {
        int byRank = Rank.CompareTo(other.Rank);
        return byRank != 0 ? byRank : string.Compare(Suit, other.Suit, StringComparison.Ordinal);
    }
    public override string ToString() => Rank + Suit;
}

public class Program
{
    public static void Main()
    {
        var hand = new List<Card>
        {
            new Card(10, "H"), new Card(2, "S"), new Card(10, "C")
        };
        hand.Sort();
        Console.WriteLine(string.Join(", ", hand));
    }
}

Kurzer Check

Rufen Sie sich den Vertrag von CompareTo ins Gedächtnis.

Zusammenfassung

IComparable<T> definiert über CompareTo eine natürliche Ordnung.

  • Negative, null und positive Werte bedeuten kleiner, gleich und größer.
  • Ermöglicht List.Sort, Array.Sort und sortierte Sammlungen.
  • Bei Gleichstand werden sekundäre Felder zum Vergleich herangezogen.
  • Halten Sie CompareTo == 0 konsistent mit Equals.

Häufig gestellte Fragen

Ist die Lektion „IComparable implementieren“ kostenlos?

Ja — der vollständige Text von „IComparable implementieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „IComparable implementieren“?

Definieren Sie mit CompareTo eine natürliche Sortierreihenfolge. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „IComparable implementieren“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. IEquatable implementieren
  2. GetHashCode überschreiben
  3. IComparable implementieren
  4. IComparer für benutzerdefinierte Sortierung
← Zurück zu C# Academy