15. april 2008 - 15:21Der er
9 kommentarer og 1 løsning
Skille ved mellemrum
Jeg skal trække en overskrift ud fra min db.. skille den ved alle mellemrum og skrive dem med hver sin farve hver gang der har været et mellemrum - hvordan gør jeg det?
sColor="" For i=0 To UBound(aText) If sColor="" Then sColor="ff0000" Else sColor="00ff00" Response.Write "<span style=""color:#"&sColor&";"">"&aText(i)&"</span> " Next aText=null
Skal hvert ord vises med en ny farve eller skal de bare veksle mellem to forskellige farver? Anyway! Så kan du bruge split og så udskrive dem igen med farvekodevalg omkring. Eksempelvis:
arrColors = array("red", "blue") arrWord = split(overskrift, " ") for each w in arrWord response.write "<span style=""color:" & arrColors(i mod 2) & """>" & w & "</span> " next
w13>> Tak endnu engang :-? fik den til at køre sådan her:
<% aText="ord med mellemrum" aText=Split(aText," ")
sColor="ff0000" For i=0 To UBound(aText) Response.Write "<span style=""color:#" & sColor&";"">" & aText(i) &"</span> " If sColor="00ff00" Then sColor="ff0000" Else sColor="00ff00" Next aText=null %>
softspot>> Din modulus-løsning med farverne i arrayet er klart at foretrække. Dog performer en for-each betydeligt dårligere end en normal for-to-løkke.
Så koden kunne blive:
<% aText=Split("ord med mellemrum"," ") aColor=array("#00ff00","#ff0000")
For i=0 To UBound(aText) Response.Write "<span style=""color:"&aColor(i mod 2)&""">"&aText(i)&"</span> " Next aText=null aColor=null %>
Først og fremmest synes jeg måske et er lidt noget pjat at snakke om performance, når antallet af gennemløb er så små, som tilfældet er her, men lad os nu sige at der rent faktisk var lidt køb på det array, så kunne det jo være interessant nok, at vide om den ene eller den anden metode var bedst.
Jeg har derfor flikket et script sammen for at teste om der er forskel og de første resultater tyder på at det forholder sig lige nøjagtig modsat af hvad du siger, dvs. for each performer (marginalt, dvs. ca 15%) bedre end for-to løkken. Jeg er dog åben overfor (konstruktiv) kritik af mit testscript, hvis du skulle mene der er mangler som fordrejer resultatet. Scriptet itererer løkkerne 1.000.000 gange hver, først indekseret, derefter enumereret og så i omvendt (enumereret og derefter indekseret), for at se om det har nogen betydning hvilken rækkefølge løkkerne køres i. Det ser således ud:
<% const MAX_LIMIT = 999999 dim a(999999), ts, tm, te
' Fyld et array med værdier... for i = 0 to MAX_LIMIT a(i) = i next
' start testen af indekseret løkke ts = timer
for i = 0 to MAX_LIMIT b = a(i) next
' tag en mellemtid og start dernæst en test af enumereret løkke tm = timer
Denne test omhandler kun array, jeg har ikke testet på en collection, så der kan være noget med for each og collections - dog tror jeg ikke det er tilfældet. Jeg synes at kunne huske, fra tidligere erfaring med VB 6, at enumereret tilgang til en collection også her er hurtigere end indekseret (velsagtens fordi collections vedligeholder en kæde af objekter, hvor en enumerator har fat i et objekt, hvortil det næste kan findes via kæden, hvorimod en indeksering skal gennemløbe hele kæden hver gang et objekt skal udtages).
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.