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:
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
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
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.
Macht ein ToDictionary die Sortierung nicht wieder zunichte, da ein Dictionary<TKey,TValue> keine Sortierung bietet?
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 ^^
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.
Dann solltest du besser eine List<KeyValuePair<K,V>>
verwenden.
Oder aber nur bei der Anzeige der Daten diese entsprechend sortieren.
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>?
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.