Dvs. at x'erne er på array 0-index, derefter er newline på 1.-3.-index. a-f er på 4.-9.-index, efterfulgt af newline på 10.-13.-index. Og så fremdeles. Jeg har en idé om at det skal være et for-loop der skal løbe blokkene igennem. A og b-f er fast, mens h-m er en blok for sig. Dog kan arrayet være længere med x antal blokke , som har samme indexstørrelse som b-f (altså 6).
Det jeg havde forestillet mig er at skulle ende med et string[] strArr = {{a}, {b-f}, {h-m}, {...}...};
Du bliver nok nød til at forklare dit spørgsmål lidt bedre! Kom eventuelt med lidt information om, hvad dette skal bruges til, da det ofte gør en problemstilling lettere at forstå.
Jeg er ved at forsøge at lave en lille applikation som skal hente mit skema fra nettet. Jeg har en klasse for hver af undervisningsdagene hvor alt overflødigt html er fjernet, og som har en string (det er IKKE en array som jeg kom til at skrive) som er opdelt i den ovennævnte inddeling.
Jeg synes det er en lidt gnidret måde at skulle arbejde en sådanne string, så jeg vil gerne have hjælp til at lave en dynamisk array, hvor indholdet er varierende. Dvs. at der enten er skemalagte lektioner den pågældende dag, eller ingen.
Jeg håber det fik kastet lidt lys over hvad jeg er ude efter :)
Jeg tror nok jeg ved hvad det er du vil og hvis det er tilfældet er der en meget nem måde at opnå dette på i C#. På den string som indeholder fagene kører du metoden .Split som opdeler din string i flere substrings udfra nogle seperatorer du vælger. Så vidt jeg kan se har du kun én seperator, nemlig "\n\n\n". Derfor kan det gøres så nemt som: string[] arr = text.Split(new string[]{"\n\n\n"}, StringSplitOptions.None); Hvor text er den string som indeholder fagene og arr er det færdige opdelte array. Hvis du har flere seperatorer end "\n\n\n", initialiserer du naturligvis først dem som et string array og anvender det som parameter i stedet for new string[]{"\n\n\n"}.
Denne kodelinje giver ingen mening. Hvis du bruger Split metoden med en char, skal du angive en liste over alle de tegn den skal søge efter. I dit eksempel angiver du at hvis tegnet er '\n' eller '\n' eller '\n' skal den splitte. Hvis du vil have den til at splitte når der er præcist 3 mellemrum, skal du bruge:
jeg kan ikke få det til at virke med en new string[]{"\n\n\n"} - jeg får bare det samme output som 4 kommentar opad, når jeg laver en array søgning på skemaDag[0]. Men hvis jeg bruger new char[] { '\n', '\n', '\n'} - kan jeg søge fint i arrayet.
Jeg har endda forsøgt at RegEx.Place(strippedRawSkema, "\n\n\n", "Ø") (hvor Ø bare skal markerer hvor der er \n)- uden at der bliver ændret noget i output. Men hvis jeg laver en replace med "\n", så kommer der Ø på alle \n-pladser.
Som aaberg skriver opdeler du lige nu din string pr. linie [selvom .Split(new char[] { '\n', '\n', '\n'}, StringSplitOptions.None) er det samme som .Split('\n')].
Det kan godt være at det er smart for dig at have hver linie i et array, således du kan hente navnet på faget på en specifik placering, men du bør overveje om det ikke er bedre først at opdele stringen i blokke og derefter opdele den blok i linjer.
Hvis det gælder at der altid er 3 linieskift mellem hver blok, vil jeg foreslå at du først bruger: string[] skemaDag = strippedRawSkema.Split(new string[] { "\n\n\n"}, StringSplitOptions.None); Nu indeholder dit array nogle blokke med tekst, en enkelt blok kunne f.eks. være Fag Undv.type fra kl. til kl. Uge(r) Lokale
Herefter kan du så iterere igennem alle blokkene og lave en ny opdeling. eks. string[] blok; string[] skemaDag = strippedRawSkema.Split(new string[] {"\n\n\n"} for(int i = 0; i < skemaDag.length; i++) { blok = skemadag[i].split('\n'); //her indsættes eventuel behandling af blokdata //f.eks. list.Add(new Fag(blok[0], blok[1], blok[2], blok[3], blok[4], blok[5])); } (Start eventuelt med i = 1, hvis første blok repræsenterer ugedagen). blok[0] vil så være titlen på faget hvis det kommer først, blok[1] aktiviteten osv. Fordelen ved at gøre det på denne måde er det det skaber overskuelighed og hvis en blok pludselig består af andet end 6 linjer - lad os eksempelvis sige at der kan komme en kommentar på til sidst - forstyrrer det ikke ordenen på de andre blokke. antallet af blokke/fag svarer til length på Skemadag.
En anden måde er at opdele arrayet på, er den måde, som du tilsyneladende er i gang med, hvor stringen opdeles pr. linie. Denne metode gør at stringen kun skal splittes én gang, men bliver besværlig at implementere, hvis ikke hver blok er på seks linjer. Det kunne eksempelvis se således ud: string[] skemaDag = strippedRawSkema.Split('\n'); for(int i = 0; i < skemaDag.lenth; i+=8) { //her indsættes eventuel behandling af blokdata //f.eks. list.Add(new Fag(skemaDag[i], skemaDag[i+1], skemaDagk[i+2], skemaDag[i+3], skemaDag[i+4], skemaDag[i+5])); } (Start eventuelt med i = 3 hvis første linje er ugedagen) Læg mærke til at i inkrementeres med 9, det sker fordi der i skemaDag arrayet vil optræde 2 tomme strings på grund af de extra 'new line' ved siden af hinanden. Her repræsenterer skemaDag[i] titlen, skemaDag[i+1] aktiviteten osv. Antallet af blokkke/fag svarer til length på skemaDag / 8 8 fordi hver fag består af 6 linjer og har 2 tomme linjer til sidst. Dette antal bliver dog forkert hvis det sidste fag i stringen ikke afsluttes af de extra linjer. Afhjælp eventuelt dette ved at lægge to til længden på skemaDag ((skemaDag.length + 2) / 8).
Jeg går, i disse eksempler, ud fra at du ønsker at bruge al dataen fra et enkelt fag i hver omgang af for-løkken (som i eksemplet til at lave dataobjekter og smide disse i en liste), hvis du blot vil udskrive disse linjer, kan du lave et normalt gennemløb og udskrive hver linje.
Det var lige akkurat det gennembrud jeg havde brug for :D
min string strippedRawSkema havde ikke kun \n, men \r\n. Hvilket betyd at jeg ikke kunne få spliit til at virke. Men nu viker det og jeg kan nu trække dynamisk indhold.
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.