Laden...

Beim Sortieren der Liste ein Property setzen

Erstellt von yngwie vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.415 Views
Y
yngwie Themenstarter:in
238 Beiträge seit 2005
vor 15 Jahren
Beim Sortieren der Liste ein Property setzen

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?

F
722 Beiträge seit 2005
vor 15 Jahren

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.

Gelöschter Account
vor 15 Jahren
Comparer<string>.Default.Compare(item1.Name, item2.Name)

das liefert dir ein int zurück
welchen wert in welchem fall kannst du in der msdn nachlesen. anhand diesen wertes kannst du dann die indexposition der beiden items incrementieren bzw decrementieren.

49.485 Beiträge seit 2005
vor 15 Jahren

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

Gelöschter Account
vor 15 Jahren

der offset ist doch immer 1 oder irre ich mich hier?

49.485 Beiträge seit 2005
vor 15 Jahren

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

Y
yngwie Themenstarter:in
238 Beiträge seit 2005
vor 15 Jahren

Hallo und Danke für eure Beitraege,

ich habe es mal prototypisch ausprobiert und folgendes festgestellt:

  • es ist tatsächlich kompliziert den Index-Offset beim Sortieren zu berechnen
  • selbst wenn ich weiss dass ein Quicksort verwendet wird und den Offset-Index berechnen kann, so würde mein Code nicht mehr richtig funktionieren sobald Array.Sort unter der Haube ein anderes Sortieralgoritmus verwendet.
  • die Implementierung eines eingenen Sortieralgos wäre interessant, aber für meine winzige Aufgabe ein absoluter Overkill.
  • das "nachziehen" der Indices in einer ItemList mit 2Mio.-Items dauert auf meinem Rechner 0,02 Sekunden.

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ß