Hallo Community,
ich habe eine typisierte Liste die ich sortieren will, was soweit kein Problem darstellt. Alle Objekte in dieser Liste haben ein öffentliches Property "public int Index{get; set;}". Der Wert dieses Property soll nach der Sortierung dem tatsächlichen Platz/Index des Objektes in der Liste entsprechen - hier der Beispielcode:
public class Item
{
public int Index { get; set; }
public string Name { get; set; }
public Item(string name)
{
this.Name = name;
}
}
public class ItemList : List<Item>
{
// überschreibe Add, Insert, Indexer usw...
public void new Add(Item item)
{
item.Index = this.Count
}
}
ItemList list = new ItemList();
list.Add(new Item("C"));
list.Add(new Item("B"));
list.Add(new Item("A"));
// Sortiere nach "Name"-Property
list.Sort(delegate(Item item1, Item item2)
{
return Comparer<string>.Default.Compare(item1.Name, item2.Name)
} );
Nun sollen alle item.Index == liste.IndexOf(item) sein. Natürlich könnte ich die Liste nach dem Sortieren noch ein mal durchlaufen und alle Indexwerte nachziehen, es wäre aber schöner diese Indexe schon bei der Sortierung zu setzen. Weiss jemand ob/wie so etwas realisiert werden kann?
während des sortierens weisst du noch nicht, wo das element später landen wird, du stellst ja nur die vergleichslogik bereit. alternativ kannst du dir natürlich einen eigenen sortieralgorithmus implementieren, aber das wäre viel aufwendiger als die liste nach dem sortieren einfach nochmal durchzugehen.
Hallo JAck30lena,
das wird nicht funktionieren, weil du ja nicht weißt, um welchen Offset du die Index-Werte erhöhen oder vermindern musst.
Hallo yngwie,
ich sehe das wie feadur.
herbivore
Hallo JAck30lena,
deine Annahme würde nur stimmen, wenn immer nur zwei direkt aufeinanderfolgende Einträge verglichen (und dann ggf. getauscht) werden würden, wie es z.B. Bubblesort macht. Bei dem von Array.Sort verwendeten Quicksort ist das nicht der Fall.
herbivore
Hallo und Danke für eure Beitraege,
ich habe es mal prototypisch ausprobiert und folgendes festgestellt:
Offensichtlich haben feadur und herbivore recht, und ich werde einfach nur einen zweiten Durchlauf über die Liste spendieren 🙂
Vielen Dank noch ein mal an alle die gepostet haben und Gruß