Gå til innhold

[Løst] Loope igjennom et 2D string array


Anbefalte innlegg

Hei

 

Tenkte jeg skulle prøve å sette opp et 2D array i VB, og dette er tydeligvis vanskeligere enn det jeg trudde det skulle være.

 

Om jeg setter opp en string som ser slik ut:

tekst1,tekst2,tekst3
tekst4,tekst5

 

Så fungerer det helt fint, den returnerer alle feltene og rad 2, felt 3 returneres tomt ettersom rad 1 har et felt 3 men ikke rad 2, men det hadde jeg forventet.

 

Men problemet mitt er at om jeg har en string som ser slik ut:

tekst1,tekst2
tekst3,tekst4,tekst5

 

Så får jeg følgende feilmelding:

index was outside the bounds of the array

 

Så om den første raden har 2 kolonner, så klarer den ikke å hente ut flere kolonner enn maks 2 i de andre radene heller.

 

Funksjonen:

Private Function TwoDimArrToString(text As String) As String(,)
Dim array As String(,) = Nothing
Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None)
For i = 0 To lines.GetUpperBound(0)
 Dim fields = lines(i).Split(","c)
 If i = 0 Then
  array = New String(lines.GetUpperBound(0), fields.GetUpperBound(0)) {}
 End If
 For j = 0 To fields.GetUpperBound(0)
  array(i, j) = (fields(j))
 Next
Next
Return array
End Function

 

Er veldig ny med 2D arrays, så kompetansen rundt dette område er ikke så høyt.

Lenke til kommentar
Videoannonse
Annonse

Du antar i koden at arrayet er rektangulært. I j loopen må du benytte GetUpperBounds(1) for å finne lengden på 2-dimensjon.

Hei og takk for rask tilbakemelding.

 

Om jeg endrer GetUpperBounds(0) til GetUpperBounds(1) i J loopen får jeg følgende feil:

Matrisen har ikke så mange dimensjoner.
Lenke til kommentar

edit glem det

 

Grunnen er at du ikke har definert størrelsen på arrayet, og glem det jeg skrev tidligere (jeg leste feil)

 

Dersom du ikke vet hvor stort et array skal være på forhånd, brude du bruke List(Of T) istedet.

 

Men i mitt tilfelle er størrelsen på arrayet variabelt, jeg vet aldri hvor mange kolonner eller rader arrayet kommer til å inneholde. Er det noen måte å gjøre dette på da?

Endret av Spenzer
Lenke til kommentar

Tja, du vet jo størrelsen, men du trenger enten List, eventuelt Jagged Arrays (Array av Arrays)

 

Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None)
Dim array As New String(1 To lines.Length)()

For i As Integer = 1 To lines.Length
 array(i) = lines(i).Split(","c)
Next

Endret av GeirGrusom
  • Liker 1
Lenke til kommentar

Ah jeg som blandet litt Visual Basic og C#:

Dim array(1 To Lines.Length)() As String

Takk for at du gidder Geir :)

 

Prøvde det du skrev nå, men om jeg ikke misforstår noe her, så vil det arrayet bli satt opp som et 1-dimensjonalt array? Noe som blir problematisk når jeg skal sette inn informasjonen i arrayet?

 

Jeg er nok helt på villspor, men sånn ser det ut atm.

 

    Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None)
    Dim array(0 To lines.Length)() As String
    For i = 0 To lines.GetUpperBound(0)
	    Dim fields = lines(i).Split(","c)
	    array(i) = New String(fields.GetUpperBound(0)) {}
	    For j = 0 To fields.GetUpperBound(0)
		    array(i, j) = (fields(j))
	    Next
    Next
    Return array

Lenke til kommentar

For i = 0 To lines.GetUpperBound(0)

Må vel være

For i = 0 To lines.GetUpperBound(0) - 1

? For løkken er inklusiv.

 

Er denne linjen som failer:

array = New String(lines.GetUpperBound(0), fields.GetUpperBound(0)) {}

 

Står følgende:

Error 1 Value of type '2-dimensional array of String' cannot be converted to '1-dimensional array of 1-dimensional array of String' because 'String' is not derived from '1-dimensional array of String'.

Endret av Spenzer
Lenke til kommentar

Det er fordi funksjonen vil ha en todimensjonal array, men det som er opprettet er en en dimensjonal array av arrays. Bytt returverdien til String()() i funksjonsdefinisjonen

Det ser ut til å fungere sånn halvveis nå, endret returverdien til String()() i funksjonsdefinisjonen samt følgende linje:

array(i, j) = (fields(j))

til

array(j) = (array(i))

 

Slik ser det ut når jeg kaller funksjonen:

Dim TwoDimensionArr()() As String
Dim MinString as String = "Rad01Kol01,Rad01Kol02" & vbNewLine & "Rad02Kol01,Rad02Kol02,Rad02Kol03"
TwoDimensionArr = StringToTwoDimensionalStringArray(MinString)
Dim bound0 As Integer = TwoDimensionArr.GetUpperBound(0)
Dim bound1 As Integer = TwoDimensionArr.GetUpperBound(1)
For i As Integer = 0 To bound0
For x As Integer = 0 To bound1
 Dim value As String = TwoDimensionArr(i, x)
 If (value = Nothing) = False Then
  MsgBox("Row: " & i + 1 & " Column: " & x + 1 & " - Value: " & value)
 End If
Next
Next

 

Det fungerer sånn ca. nå. Jeg får ut elementene på den første raden, i dette tilfellet: Rad01Kol01 og Rad01Kol02.

 

Deretter får jeg følgende feil:

Indeksen var utenfor matrisegrensen.

 

EDIT: Forresten i funksjonen, skal det stå GetUpperBound(0) eller (1) på bound1? Ettersom det ikke lenger er et todimensjonalt array?

 

Jeg tipper feilen forresten ligger i følgende linje:

array(j) = (array(i))

 

Ettersom jeg bare erstatter innholdet i arrayet. Forsøkte også å gjøre slik:

array = array(j)(array(i))

Endret av Spenzer
Lenke til kommentar

Private Function TwoDimArrToString(text As String) As String()()
Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None)
Dim array = New String(0 To lines.Length - 1)()

For i = 0 To lines.GetUpperBound(0) - 1
 array(i) = lines(i).Split(","c)
Next
Return array
End Function

Det er ikke noen UpperBounds(1) på jagged arrays, ettersom lengden på det innerste arrayet vil variere.

Endret av GeirGrusom
  • Liker 1
Lenke til kommentar

Private Function TwoDimArrToString(text As String) As String()()
Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None)
Dim array = New String(0 To lines.Length - 1)()

For i = 0 To lines.GetUpperBound(0) - 1
 array(i) = lines(i).Split(","c)
Next
Return array
End Function

Det er ikke noen UpperBounds(1) på jagged arrays, ettersom lengden på det innerste arrayet vil variere.

 

Det hjalp enda mer, nå er det vel bare siste steget igjen :p

 

Jeg klarer nå å hente ut rad 1 samt alle kolonner, rad 2 samt alle kolonner, men den failer på siste raden.

 

Slik ser funksjonen ut nå:

Public Function StringToTwoDimensionalStringArray(text As String) As String()()
	Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None)
	Dim array(0 To lines.Length - 1)() As String
	For i = 0 To lines.GetUpperBound(0) - 1
		array(i) = lines(i).Split(","c)
	Next
	Return array
End Function

 

Slik ser det ut når jeg kaller til funksjonen:

	Dim TwoDimensionArr()() As String
	TwoDimensionArr = StringToTwoDimensionalStringArray(MinString)
	For i As Integer = 0 To TwoDimensionArr.GetUpperBound(0)
		For x As Integer = 0 To TwoDimensionArr(i).GetUpperBound(0)
			MsgBox("Row: " & i + 1 & " Column: " & x + 1 & " - Value: " & TwoDimensionArr(i)(x))
		Next
	Next

 

EDIT: Får følgende feil

Additional information: Objektreferanse er ikke satt til en objektforekomst.

på følgende linje:

For x As Integer = 0 To TwoDimensionArr(i).GetUpperBound(0)

Endret av Spenzer
Lenke til kommentar

Ok, etter litt testing fant jeg ut problemet, så nå fungerer det.

 

Funksjonen ser nå slik ut:

Public Function StringToTwoDimensionalStringArray(text As String) As String()()
	Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None)
	Dim array(0 To lines.Length)() As String
	For i = 0 To lines.GetUpperBound(0)
		array(i) = lines(i).Split(","c)
	Next
	Return array
End Function

 

Slik ser det ut når jeg kaller til funksjonen:

	Dim TwoDimensionArr()() As String
	TwoDimensionArr = StringToTwoDimensionalStringArray(MinString)
	For i As Integer = 0 To TwoDimensionArr.GetUpperBound(0) - 1
		For x As Integer = 0 To TwoDimensionArr(i).GetUpperBound(0)
			MsgBox("Row: " & i + 1 & " Column: " & x + 1 & " - Value: " & TwoDimensionArr(i)(x))
		Next
	Next

 

Tusen takk for all hjelp GeirGrusom !

Endret av Spenzer
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...