Laden...

Dictionary sortieren mit mehreren (verschiedenen) Kriterien

Erstellt von Frokuss vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.436 Views
F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren
Dictionary sortieren mit mehreren (verschiedenen) Kriterien

Einen wunderschönen guten Tag 😃

ich habe da (hoffentlich) nur ein kleines Problem. Und zwar möchte ich gerne einen Dictionary nach verschiedenen Kriterien sortieren...

Folgender Code sortiert mir das ganze nur nach der ID...

public Dictionary<int, Liste> objChildsL = new Dictionary<int, Liste>();
objChildsL = objChildsL.OrderBy(obj => obj.Key).ToDictionary(obj => obj.Key, obj => obj.Value);

Allerdings will ich folgendes haben:

  • ich habe in dem Dictionary genau ein Element mit einer negativen ID (daher der Key ist kleiner 0).
    • Dieser muss an der ersten Stelle stehen
  • alle anderen Einträge im Dictionary hingegen sollen nach dem Value.Text sortiert werden.
    • diese sollen Alphabetisch sortiert werden - hauptsache nach dem Key mit negativen Vorzeichen...

Allerdings habe ich kein Ahnung, wie ich dies realisieren kann. Auch weis ich nicht, ob die verwendete Methode dies bewerkstellingen könnte.

Brauche ich eventuell etwas anders? Ich hoffe ihr könnt mir da weiterhelfen?

Lieben Gruß
Frokuss

EDIT: Ich bräuchte also eine priorisierung a la:
1.) obj => obj.Key < 0 ; sonst
2.) obj => obj.Value

1.029 Beiträge seit 2010
vor 4 Jahren

Hi,

in diesem Fall dürfte ein "ThenBy" bereits genügen, da es ja nur den einen negativen Key gibt.

Sähe dann also folgendermaßen aus:


objChildsL = objChildsL
                .OrderBy(obj => obj.Key)
                .ThenBy(obj => obj.Value)
                .ToDictionary(obj => obj.Key, obj => obj.Value);

Sofern das etwas komplizierter werden würde - kann man einen eigenen IComparer schreiben und diesem beim Aufruf von "OrderBy" aufrufen - dazu findest du via Google jede Menge Results.

LG

4.931 Beiträge seit 2008
vor 4 Jahren

Mit ThenBy würde aber nur bei gleichem Key nach dem Value sortiert werden (als Subkriterium).

Also


OrderBy(obj => obj.Key < 0 ? String.Empty : obj.Value.Text)

d.h. ich gehe davon aus, daß ein leerer Text immer 'kleiner' als andere Texte ist.

D
152 Beiträge seit 2013
vor 4 Jahren

Macht ein ToDictionary die Sortierung nicht wieder zunichte, da ein Dictionary<TKey,TValue> keine Sortierung bietet?

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren

Cool, vielen Dank euch beiden. Die Lösung von Th69 war in der Tat das was ich brauchte. Denke dieses OrderBy ist ähnlich zu SQL? Allerdings habe ich bisher noch nie in C# mit Linq gearbeitet (bis heute) ^^

Also. Vielen Dank euch beiden 😃
Frokuss

PS: Habe auch noch nie mit diesem ? statemants gemacht...

@david.m: Zumindestens kommt bei mir eine anschauliche Lösung raus. Ich denke der Dictionary wird der Reihenfolge nach abgearbeitet - daher das als erstes eingefügte Element wird auch als erstes in ner forech durchlaufen - allerdings habe ich ungefähr Null-Ahnung hiervon ^^

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren

Allerdings würde folgendes aus dem artikel das wohl von dir nur bestätigen...

Bei der Enumeration wird jedes Element im Wörterbuch als behandelt eine KeyValuePair<TKey,TValue> Struktur, die einen Wert und ihrem Schlüssel darstellt. Die Reihenfolge, in der die Elemente zurückgegeben werden, ist nicht definiert.

4.931 Beiträge seit 2008
vor 4 Jahren

Dann solltest du besser eine List<KeyValuePair<K,V>> verwenden.
Oder aber nur bei der Anzeige der Daten diese entsprechend sortieren.

W
955 Beiträge seit 2010
vor 4 Jahren

In der Doku zu Dictionary<K,V> steht: The order of the values in the Dictionary<TKey,TValue>.ValueCollection is unspecified. Wozu brauchst du ein Dictionary? Warum keine List<T>?

T
2.219 Beiträge seit 2008
vor 4 Jahren

Klingt eher nach einem Fall von SortedList<TKey, TValue>
Dabei wird die Liste aber nach dem Comparer des Key sortiert.
Dann kannst du dir eine eigene Klasse anlegen, die deinen Key abbildet und dabei im Comparer deine Sortierung umsetzt.
Der Vorteil dabei wäre, dass beim hinzufügen/entfernen von Einträge die Reihenfolge deiner Einträge immer nach dem Comparer sortiert werden.
Somit hast du also nach deiner Comparer Logik immer die gewünschte Reihenfolge garantiert.

Oder du nimmst eine List<T> und musst per Sort dann den Comparer zum sortieren deiner Liste mitgeben.
Um die Comparrer Implementierung kommst du wegen deiner Custom Sortierung nicht herum.
Bei der normalen List<T> hast du aber keine garantierte Reihenfolge.
Wenn du die Liste einmal sortierst und dann durch Remove/Add veränderst, kann deine Reihenfolge wieder falsch sein und du musst wieder per Sort die Liste sortieren.

Nachtrag:
Der Sinn eines Dictionary ist nicht, die Reihenfolge der Elemente zu kennen oder vorgeben zu müssen.
Der Sinn ist es über einen Schlüssel direkt auf die Elemente zugreifen zu können ohne durch die gesamten Einträge durchlaufen zu müssen.
Die Reihenfolge der Einträge spielt dabei keine Rolle, da die Elemente über den Hash des Key gesucht werden.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.