C# Sortieren von Werten |
25.04.2014, 17:27 | Auf diesen Beitrag antworten » | |||||||||||||||
InformaTiger | C# Sortieren von Werten Hallo, ich programmiere gerade einen Selfmonitor der mir anhand von Werten die in einer Datenbank gespeichert sind einen bzw. mehrere Graphen zeichnen soll. Die Schwierigkeit besteht für mich darin die Werte so einzusetzen damit ich mir möglichst Ressourcen sparend die Graphen zeichnen kann. Mein bisheriger Ansatz ist so:
Ich bin der Meinung das müsste einfacher gehen um sich die vielen Listen zu sparen. Leider weiß ich nicht wie genau aber ich könnte mir vorstellen es hätte was mit mehrdimensonalen Arrays zu tun. Mfg InformaTiger |
|||||||||||||||
|
||||||||||||||||
25.04.2014, 19:00 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | erstelle doch eine Klasse, in der du datum, bewertung, kategorie und farbe speicherst:
|
|||||||||||||||
25.04.2014, 19:08 | Auf diesen Beitrag antworten » | |||||||||||||||
InformaTiger | Danke! Auf diese Idee bin ich logischerweise wieder mal nicht gekommen. Inzwischen bin ich auf ein weiteres Problem gestoßen. Wenn ich den Graph mittels DrawLine zeichne:
Sieht das Ergebnis wie im Anhang aus, also muss ich es zusätzlich noch irgendwie schaffen auszulesen wann eine neue Kategorie von der Schleife bearbeitet wird. Mfg InformaTiger |
|||||||||||||||
25.04.2014, 20:12 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | so vielleicht:
|
|||||||||||||||
Anzeige | ||||||||||||||||
|
||||||||||||||||
25.04.2014, 20:43 | Auf diesen Beitrag antworten » | |||||||||||||||
InformaTiger | Das Problem hierbei besteht eben darin dass die Werte nicht sortiert nach Kategorie gespeichert sind, weil der Benutzer ja in beliebiger Reihenfolge die Werte in die Tabellen schreiben kann. Kann man die Liste aus Objekten die wir vorhin angelegt haben nach Kategorie sortieren? Mfg InformaTiger |
|||||||||||||||
25.04.2014, 20:51 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Bin gerade mit Linux unterwegs, daher ohne Syntaxprüfung:
hier noch ein ausführlicheres Beispiel: msdn.microsoft.com |
|||||||||||||||
25.04.2014, 21:44 | Auf diesen Beitrag antworten » | |||||||||||||||
InformaTiger | Ich habe soeben diese Methode getestet, mein Ergebnis war alles andere als erfreulich: ein totales durcheinander aus Strichen. Allerdings habe ich das Problem durch einen ORDER BY beim SQL-Command gelöst. Den Code habe ich jetzt folgendermaßen erweitert:
Funktionieren laut Haltepunkte müsste es, aber grafisch sehe ich jetzt nur mehr den 1 Graphen. Edit: habe meinen Fehler gefunden, ich habe den ersten Graphen 2 mal gezeichnet. ich muss jetzt da ich die Anzahl jeder Kategorie habe nur herausfinden wie ich zurücksetzen kann sodass nach jeder Kategorie abgebrochen und bei dem neuen Datum wieder begonnen wird. Mfg InformaTiger |
|||||||||||||||
25.04.2014, 22:38 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Hatte dein edit nicht gesehen, falls es noch aktuell ist: Mein Code macht das, was in Anhang zu sehen ist, ich dachte, das wolltest du?
|
|||||||||||||||
26.04.2014, 00:13 | Auf diesen Beitrag antworten » | |||||||||||||||
InformaTiger | So... dank der Hilfe meines Bruders ist es mir jetzt endlich gelungen. Der Code dazu sieht so aus:
Die Variable old speichert jeweils den letzten Stand und sorgt dafür dass Einträge die alleine stehen und noch keinen Referenzpunkt haben auch angezeigt werden. Wichtig war auch bei der SQL Anweisung eine sekundäre Sortierung hinzuzufügen: ORDER BY tbl_categories.Name, tbl_values.Datum; PS: wenn du noch was verbessern wüsstest, bitte einfach nur machen Danke für deine Hilfe! Mfg InformaTiger |
|||||||||||||||
26.04.2014, 07:14 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Wenn du schon so fragst, das gefällt mir nicht:
Ich weiß nicht, wie viele Einträge du bei deiner SQL-Abfrage erhältst, aber die musst du alle zwischenspeichern, um dann den Großteil wieder zu löschen. Ich würde das hier bevorzugen:
Je nach Anzahl der Kategorien könnte es Sinn machen, die Liste sortiert zu halten, das beschleunigt das Suchen. Das ginge so:
(von Microsoft) |
|||||||||||||||
26.04.2014, 16:41 | Auf diesen Beitrag antworten » | |||||||||||||||
InformaTiger | Also wenn ich das richtig verstanden habe, was du zu bemängeln hast dann ist das Prinzip dasselbe wie das hier:
Nur, dass du mit einer anderen Methode den index bekommst als ich in dem Beispiel. Sortiert ist meine Liste ja ohnehin schon, da ich sie mit dem ORDER BY Kommando sortiert aus der Datenbank erhalte. Wobei ich sagen muss dass der zweite Code von dir noch effizienter ist.
Mfg InformaTiger |
|||||||||||||||
26.04.2014, 23:43 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito | Hallo, wenn es Kategorien nicht doppelt geben kann, warum verwendet ihr dann nicht ein Set? Sets entsprechen mathematischen Mengen und sind so gebaut, dass sie effizient ermöglichen Elemente nur einmalig aufzunehmen (In Mengen kann es ja auch keine Doppelten geben). Bei einem HashSet hat man idealisiert konstante Laufzeit, d.h. jeder Einfügevorgang (mit Prüfung auf doppelte) und jeder Suchvorgang (contains()) dauert idealisiert eine konstante Zeit, unabhängig von der Anzahl der Elemente (in der Realität klappt das nicht ganz). Problem ist, dass ein HashSet nicht sortiert ist. Für sortierte Mengen gibt es noch das SortedSet. Ich denke das hat dann logarithmische Laufzeit (auch sehr gut). Jedenfalls spart man sich die Prüfung auf doppelte und das selektive Einfügen. Gruß, Karlito |
|||||||||||||||
27.04.2014, 08:44 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Guter Einwand, Karlito. Noch ein Vorschlag, wie es auch mit einer einfachen List effizient geht: da bereits nach kategorie sortiert ist, reicht es, den letzten Eintrag zu prüfen:
|
|||||||||||||||
27.04.2014, 13:27 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito | Hallo euler, hallo InformaTiger, auch wenn man es vielleicht so biegen kann, dass eine Liste effizient wird, so würde ich mich darauf verlassen, das die Implementierung des Sets effiizienter ist. Schließlich ist sie für genau diesen Zweck gebaut. Ansonsten würde ich eine Liste, welche optimiert ist selbst implementieren. Mich würde an der Stelle mal ein Vergleich Interessieren: 1 Mio eindeutige Einfügevorgänge für eine Liste und das Selbe für ein Set. Ich würde darauf tippen, dass das Set gewinnt. Spätestens beim Speicherverbrauch. Sorry, wenn die Diskussion hier zu weit geht. Gruß, Karlito |
|||||||||||||||
02.05.2014, 16:20 | Auf diesen Beitrag antworten » | |||||||||||||||
InformaTiger | Hallo, entschuldigt bitte, dass ich mich nicht mehr gemeldet habe. Ich hatte in letzter Zeit nur etwas Stress . Dann sollte ich also ein Set verwenden und die Geschichte wäre von der Preformance her, gegessen? Mfg InformaTiger |
|||||||||||||||
02.05.2014, 16:45 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito | Ich denke ja, es sollte schneller werden. Gruß, Karlito |
|||||||||||||||
02.05.2014, 16:59 | Auf diesen Beitrag antworten » | |||||||||||||||
InformaTiger | Wenn ich jetzt aber ein Set verwende kann ich mir dann die if-Abfrage sparen, oder? Er nimmt Werte ja nur einmalig auf oder hab ich da etwas falsch verstanden? Mfg InformaTiger |
|||||||||||||||
02.05.2014, 19:13 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito | genau |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
Die Neuesten » |
|