myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » Dictionary sortieren mit mehreren (verschiedenen) Kriterien
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Dictionary sortieren mit mehreren (verschiedenen) Kriterien

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Frokuss
myCSharp.de-Mitglied

Dabei seit: 26.08.2015
Beiträge: 118


Frokuss ist offline

Dictionary sortieren mit mehreren (verschiedenen) Kriterien

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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...

C#-Code:
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 18.07.2019 12:34.

18.07.2019 12:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Taipi88 Taipi88 ist männlich
myCSharp.de-Mitglied

avatar-3220.jpg


Dabei seit: 02.02.2010
Beiträge: 957
Entwicklungsumgebung: VS 2010
Herkunft: Mainz


Taipi88 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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
18.07.2019 12:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.311
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Also

C#-Code:
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.
18.07.2019 13:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
david.m
myCSharp.de-Mitglied

Dabei seit: 02.06.2013
Beiträge: 82


david.m ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Macht ein  ToDictionary die Sortierung nicht wieder zunichte, da ein  Dictionary<TKey,TValue> keine Sortierung bietet?
18.07.2019 14:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Frokuss
myCSharp.de-Mitglied

Dabei seit: 26.08.2015
Beiträge: 118

Themenstarter Thema begonnen von Frokuss

Frokuss ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 ^^
18.07.2019 14:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Frokuss
myCSharp.de-Mitglied

Dabei seit: 26.08.2015
Beiträge: 118

Themenstarter Thema begonnen von Frokuss

Frokuss ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
18.07.2019 14:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.311
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Dann solltest du besser eine List<KeyValuePair<K,V>> verwenden.
Oder aber nur bei der Anzeige der Daten diese entsprechend sortieren.
18.07.2019 14:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 819


witte ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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>?
18.07.2019 14:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.269
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 18.07.2019 15:04.

18.07.2019 15:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 20.08.2019 22:29