Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Dictionary sortieren mit mehreren (verschiedenen) Kriterien
Frokuss
myCSharp.de - Member



Dabei seit:
Beiträge: 156

Themenstarter:

Dictionary sortieren mit mehreren (verschiedenen) Kriterien

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Frokuss am .
private Nachricht | Beiträge des Benutzers
Taipi88
myCSharp.de - Member

Avatar #avatar-3220.jpg


Dabei seit:
Beiträge: 1044
Herkunft: Mainz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3950

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
david.m
myCSharp.de - Member



Dabei seit:
Beiträge: 108

beantworten | zitieren | melden

Macht ein ToDictionary die Sortierung nicht wieder zunichte, da ein Dictionary<TKey,TValue> keine Sortierung bietet?
private Nachricht | Beiträge des Benutzers
Frokuss
myCSharp.de - Member



Dabei seit:
Beiträge: 156

Themenstarter:

beantworten | zitieren | melden

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 ^^
private Nachricht | Beiträge des Benutzers
Frokuss
myCSharp.de - Member



Dabei seit:
Beiträge: 156

Themenstarter:

beantworten | zitieren | melden

Allerdings würde folgendes aus dem artikel das wohl von dir nur bestätigen...
Zitat
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.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3950

beantworten | zitieren | melden

Dann solltest du besser eine List<KeyValuePair<K,V>> verwenden.
Oder aber nur bei der Anzeige der Daten diese entsprechend sortieren.
private Nachricht | Beiträge des Benutzers
witte
myCSharp.de - Member



Dabei seit:
Beiträge: 959

beantworten | zitieren | melden

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>?
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1768
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am .
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.
private Nachricht | Beiträge des Benutzers