Hvordan gør du det idag, eller hvordan havde du tænkt på det første gang? Du har vel MapID, locX og locY oplysningerne ved hånden når du leder efter CellInfo oplysningen?
Altså hvis du laver et multidimensioneret array, kan du så ikke "bare" udlæse data'en?
int Array[100][200][300][4]
Så burde du kunne hente det hele ved at skrive: Array[MapID][locX][locY] - Hvis du så har flere pladser (CellInfo's) så er det her du skal lave en foreach.
Håber det giver lidt mening, sidder ikke med mit IDE tændt, så jeg kan ikke lige teste det hele igennem. Post gerne noget kode hvis du prøver mit forslag, så vil jeg se det igennem.
Nu har jeg rodet lidt med det hele og fået tændt mit IDE, jeg kan altså ikke se hvad dit problem med et "almindeligt" multidimensional array skulle være?
public int[,,,] Temp = new int[3751,64,64,1];
private void button1_Click(object sender, EventArgs e) { int TempInt = 0; for (int i = 0; i < 3751; i++) { for (int j = 0; j < 64; j++) { for (int h = 0; h < 64; h++) { Temp[i, j, h, 0] = TempInt > 0 ? 0 : 1; TempInt = TempInt > 0 ? 0 : 1; } } }
MessageBox.Show("Done"); }
private void button2_Click(object sender, EventArgs e) { int MapID = int.Parse(textBox1.Text); int locX = int.Parse(textBox2.Text); int locY = int.Parse(textBox3.Text);
Det er lavet i en windows form, og jeg synes ikke responsetiden er særlig dårlig, du burde nok kunne lave det om til dit program og se hvordan det virker.
Ok, det kan godt være den overstående med CalculateCellIndex virker lidt hexet, ikke desto mindre performer den.
den piller 100.000.000 (og addere dem til den hjælpe variabel der er) på under 2 sekunder på den computer jeg sider på... Multidementionelt array bruger 8 sekunder...
Skal vi ikke prøve at blive enige om nogle ting her, så vi kan hjælpe dig videre? :o)
Altså du har: *3751 forskellige maps. *Hvert map har 64 forskellige locX værdier. *Hvert map har 64 forskellige locY værdier. *Til sidst har du kun en CellInfo værdi.
Er det sådan din verden ser ud? Kan man måske få noget af filen, måske bare 1000 rækker, så man kan se hvad du arbejder med?
Men for at vise hvordan du kunne lave din kode:
public int[,,,] MapInfoArray = new int[3752,65,65,0];
//Dette skal declares uden for din funktion så den bliver public (Eller private hvis det er i den samme klasse), så vi kan rive fat i den på et andet sted i din kode.
while (y < ysize) { int x = 1; while (x < xsize) { int cellinfo = br.ReadInt16(); int cellinfo1 = br.ReadInt16();
Jeg går ud fra du får dit mapid et eller sted fra, fra selve filen? Men det har du sikkert styr på. Jeg kan se du sætter X=1 hver gang du løber igennem y, så jeg forventer du gør det samme med y uden for den yderste while løkke. Det du skal huske på er at arrays zero-index based, så deres første plads starter ved 0 (nul). Så jeg har udvidet arrayet så det kan håndtere du sætter den til 1, ellers vil du får en bound-exception omkring at du prøver at tilgå en plads i dit array som ikke er oprettet i hukommelse.
Hvis du laver en funktion minder om denne, så kan du udlæse værdien fra cellinfo baseret på Mapid, locX, locY:
private int ReadCellInfo(int intMapID, int intlocX, int intlocY) { return MapInfoArray[intMapID, intlocX, intlocY, 0]; }
Det var jo faktisk lettere genialt det du har lavet, jeg havde nok set du lavede en bitshifting, men kunne ikke lige gennemskue hvorfor og hvorfor du lavede en modolus 4096 på i variablen i din første løkke. Men nu begynder det hele at falde på plads, fordi du kun brugere et stort array med alle pladser og håndtere index håndteringen i en int variable vha. bit shifting...
Da jeg ikke havde nogen ide om hvad for noget der skulle lagres som "cellinfo" så smed jeg bare et eller andet i... og det blev til en i % 4096 (så har alle cells på et kort sit eget id)... så går jeg derfra ud fra at bjering selv kan smide den korekte information i :)...
Synes da der er masser af svar, men du har ikke rigtig kommenteret nogen af dem.
Dvs ... Masser af svar, men du har fundet en anden løsning ?
// ouT
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.