Donnerstag, 2. September 2010

Listen sortieren

Listen werden im .Net Framework durch die Klasse List<T> repräsentiert, wobei T einen bestimmten Datentyp angibt, die Listen sind also typisiert, heißt sie nehmen zwecks Datenkonsistenz nur Objekte eines Typs auf.
In diesem Post geht es um die Sortierung von Listen, da im vorigen Post aber bereits auführlich die Sortierung von Arrays erklärt wurde, fällt dieser etwas kürzer aus. Bei Arrays wurde die statische Funktion Array.Sort() benutzt, bei Listen muss die Instanzfunktion benutzt werden. Das bedeutet, dass bei Arrays die Funktion von der nicht instanzierten Klasse Array aufgerufen werden konnte, bei Listen muss die Funktion von einer Instanz der Klasse List aufgerufen werden, also zum Beispiel MeineAngelegtListe.Sort().
Folgender Beispielcode sortiert die Liste TestList absteigend:

List<int> TestList = new List<int>(){5, 1, 2, 4, 3}; // Kurzschreibweise zur Erzeugung von gefüllten Listen
TestList.Sort(); // sortiert die Liste aufsteigend
TestList.Reverse(); // kehrt die Reihenfolge der Objekte in der Liste um, die Elemente sind so absteigend geordnet

Kommentare:

  1. Verkettete Listen sind in .NET LinkedList.
    List ist eine Dynamische Liste. Also ein Array mit Dynamischer größe.

    Und das 'T' bedeutet, das sie Objekte eines definierbaren Basistyps annimmt.

    Aber ansonsten --> weiter so ;-)

    AntwortenLöschen
  2. Hey stimmt, ich weiß gar nicht woher das "verkette" vor Listen kam, hab wahrscheinlcih grad an was anderes gedacht ;-)
    Danke!

    AntwortenLöschen
  3. Hey,
    wie funktioniert das denn wenn ich in meiner Liste eine eigene Klasse einbinde mit einer String und einer int variable und ich nach der größe der int-variable sortieren möchte?
    Ich habe was gefunden womit ich nach dem String sortieren kann, dazu brauch ich eine weitere Klasse mit der Schnittstelle IComparer.
    Aber ich bekomms nich hin nach der int-variable zu sortieren, weiß da einer rat?

    AntwortenLöschen
    Antworten
    1. Hallo,
      das funktioniert folgendermaßen:

      List TestList = new List() { new DummyClass(2, "hans"), new DummyClass(1, "monika") }; // Kurzschreibweise zur Erzeugung von gefüllten Listen
      TestList.Sort(new DummyClass()); // sortiert die Liste aufsteigend

      Wobei DummyClass so aussieht:

      public class DummyClass : IComparer
      {
      public int Index;
      public string Value;

      public DummyClass()
      {
      }

      public DummyClass(int i, string v)
      {
      Index = i;
      Value = v;
      }

      int IComparer.Compare(DummyClass x, DummyClass y)
      {
      if (x.Index < y.Index)
      return -1;
      else
      if (x.Index == y.Index)
      return 0;
      else
      return 1;
      }
      }

      Löschen
    2. Vielen dank :)

      Löschen
  4. Hey,gutes Beispiel.
    Wie sieht die Lösung aus wenn ich nach 2 oder 3 Kriterien der Liste sortieren will; zb. 1 nach Index, 2 nach Alter, 3 nach Name? Und wie schreibt man dafür die IComparer Methode,

    AntwortenLöschen
    Antworten
    1. Dann einfach in der If - Abzweigung bei Gleichheit des 1. Elements den weiteren Code schreiben.
      Hier nochmal der obige Code damit:

      List TestList = new List() { new DummyClass(2, "hans"), new DummyClass(1, "monika"), new DummyClass(1, "anna") }; // Kurzschreibweise zur Erzeugung von gefüllten Listen
      TestList.Sort(new DummyClass()); // sortiert die Liste aufsteigend

      DummyClass sieht wie folgt aus:

      class DummyClass : IComparer
      {
      public int Index;
      public string Value;

      public DummyClass()
      {
      }

      public DummyClass(int i, string v)
      {
      Index = i;
      Value = v;
      }

      int IComparer.Compare(DummyClass x, DummyClass y)
      {
      if (x.Index < y.Index)
      return -1;
      else
      if (x.Index == y.Index)
      {
      return String.Compare(x.Value, y.Value);
      }
      else
      return 1;
      }
      }

      Löschen