C# - Custom DataTable sortering

Tags:    c#

Hej udviklere :)

Detter er til den som har lidt tid til overs. Enlig har jeg løst det. Men jeg er ret sikker på at det kan gøres meget beder...

Jeg er ved at lave et galleri som skal opsættes grafisk i et gridview af fire forskellige kasser.

Hver kasse har en type = { 1, 2, 3, 4 }
Fra databasen hentes alt dataen ud i en DataTable
+---------------------------------+
|fldID|fldImg     |fldRowsType|
+---------------------------------+
|     1|test1.jpg |                 2|
|     2|test2.jpg |                 1|
|     3|test3.jpg |                 4|
|     4|test4.jpg |                 4|
|     5|test5.jpg |                 3|
|     6|test7.jpg |                 1|

Denne DataTabel vil jeg nu have sorteret efter en "patten"
patten = { 1, 4, 2, 3, 2, 3, 2, 2, 2, 1, 4 }

Den måde jeg har løst det på er
Fold kodeboks ind/udCSharp kode 


Det ville være rigtig fedt hvis i havde nogle forslag eller idéer til at hjælpe mig med dette :)
Og uanset hvad så bare tak vis i har gidet at tage jer tid til at kigge på opslaget



Indlæg senest redigeret d. 02.05.2013 19:12 af Bruger #17119
1 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Er det meget vigtigt om det altid er den første i en rowtype der bruges som den første af denne type? Eller skal det bare være den rowtype?

Altså at der måske bruges test7.jpg i stedet for test1.jpg? Eller om der skal bruges den første?

Jeg har ikke testet dette i Visual Studio så kan godt være der er nogle småfejl i, både med syntaks og stavemåde. Håber dog du kan forstå hvad det er jeg forsøger at gøre:
Fold kodeboks ind/udCSharp kode 


Jeg forsøger hele tiden af finde det næste gridPattern der skal findes.
Gennemgår listen af billeder fra toppen hver gang fordi jeg ikke ved hvilke billeder der er taget.
Hver gang man støder på et billede af den type man søgte efter, skrives det i listen som det index er brugt allerede.
Derefter begynder man forfra igen fordi de ikke absolut ligger i rækkefølge jo og derfor skal tages forfra så vi får alle med.
Hvis den på noget tidspunkt kommer til et tal hvor den ikke kan finde det den beder om så stopper den (!foundPattern).

Jeg tænkte lidt over ovenstående metode til hvis din database vokser til ret mange billeder så bliver den tung fordi du begynder forfra hver gang og så skip'er dem du har taget. Det kan afhjælpes hvis du laver en min-start index hvor du skal tælle sammen til den højeste i listen (usedRows) som ligger i sammenhæng så du ikke skal begynde helt fra starten hver gang. Men det kan også gøres endnu bedre.

Hvis du skal optimere det yderligere ville jeg gå billederne igennem en for en, og så kan du jo beregne dig frem til hvilken plads de skal have (index-wise). Så når du støder på den første og får rowtype 2, kan du beregne dig til hvor den skal være i forhold til dit gridPattern.

Det gør din kode noget mere kompleks og du kan overveje at lave nogle intelligente objekter der bedre kan holde styr på patterns og positioner så du ikke skal beregne på den måde, men skaber nogle objekter der kender hvor 1 er, hvor 4 er, hvor 2 og alle ved hvor næste index skal være.
Det kan du gøre ved at vide hvilke positioner dine 1'ere skal være på, og så samtidigt holde styr på hvor mange billeder du har fundet af typen 1. Så den første 1'er du finder skal du placere i indeks(0) fordi der er 0 billeder af typen 1, og første index er 0. Næste gang du møder en 1'er vil du sige der er allerede et billede, og der er et mellemrum på 9 imellem 1'er billederne - derfor skal du sige billedcount (af 1'ere) gange med forskel i billedplacering (9) => 1 * 9.

Den bliver så noget sværere ved fx 2, fordi der er mellemrummet ikke det samme. Så her skal du have have et array med forskelspositioner.
[2,4,5,6,7]

Efter første gennemløb ser det anderledes ud fordi du vil have længden på pattern (11 = 11 - 1 = 10 = index'et) og vide at 10 + 2 giver dit næste jump. Håber du kan se hvad jeg mener.

Jeg har ikke lige tiden nu til at lave selve udregningerne, men din kode vil blive noget mere intens og besværlig at forstå - men fordelen i det vil så også være at så snart du kommer til et tal/billede vil du kunne vide hvor det skal placeres ud fra din udregning. Dermed vil du få langt mere optimal kode fordi du går kun dine billeder igennem 1 gang, og får dermed hele dit resultat.
Hvis du ender med at lave en dictionary med index, row så vil du faktisk nemt kunne se hvornår du skal stoppe og du ikke har til et komplet gridPattern.
Du vil blot sige
Fold kodeboks ind/udCSharp kode 


Så snart du kommer ud så ved du at ikke længere har den placering i dit pattern. Og så kan du jo nemt beregne dig til hvor mange patterns du kan udfylde fordi du ved at hver pattern fylder 10 pladser så du skal blot have rundet ned til nærmeste hele 10/20 etc.

Ved det er ret indviklet og sikkert dårligt beskrevet, men håber det er nogenlunde forståeligt og du kan se hvad jeg mener.



t