Si hago esto:
Código
Dim P As String() = {"[Primero]", "a", "b", "c", "[Segundo]"} MessageBox.Show(CStr(P.ToList.IndexOf("[Segundo]")))
Me devuelve el índice correctamente.
Si hago esto otro:
Código
Dim P As New List(Of String) P.AddRange({"[Primero]", "a", "b", "c", "[Segundo]"}) MessageBox.Show(CStr(P.IndexOf("[Segundo]")))
También me devuelve el índice correctamente
Sin embargo con un array obtenido con Split no funciona, me devuelve -1.
Código
Dim Texto As String = "[Primero]" & Environment.NewLine & "a" & Environment.NewLine & "b" & Environment.NewLine & "c" & Environment.NewLine & "[Segundo]" Dim P As New List(Of String) P.AddRange((Texto.ToString.Trim.Split(CChar(Environment.NewLine)))) MessageBox.Show(CStr(P.IndexOf("[Segundo]"))) MessageBox.Show(CStr(P(4)))
No acabo de entender porqué si al llamarlo con P(4), si que me devuelve el valor. O sea que el elemento está en la lista P, sin embargo no me devuelve el índice.
Gracias
Conseguí hacerlo:
Código
Dim Texto As String = "[Primero]" & Environment.NewLine & "a" & Environment.NewLine & "b" & Environment.NewLine & "c" & Environment.NewLine & "[Segundo]" Dim spl() As String = Texto.Split(CChar(Environment.NewLine)) Dim Lista As New List(Of String) For Each Item As String In spl Lista.Add(Item.Trim) Next MessageBox.Show(Lista.IndexOf("[Segundo]").ToString)
Pero sigo si entender porque no puedo obtenerlo directamente como puse antes o usando directamente el array String:
Código
Dim spl() As String = Texto.Split(CChar(Environment.NewLine)) MessageBox.Show(spl.ToList.IndexOf("[Segundo]").ToString)
Parece que Split devuelve los valores con espacios, de ahí que haya añadido Trim, para eliminar los caracteres de espacio.
Si lo pusiera así:
Código
me devolvería -1 nuevamente.
... For Each Item As String In spl Lista.Add(Item) Next MessageBox.Show(Lista.IndexOf("[Segundo]").ToString)
Encontré otra solución para quien le sirva. Consiste en reemplazar el espacio de cada elemento, sin necesidad de crear otro array
Código
Dim Texto As String = "[Primero]" & Environment.NewLine & "a" & Environment.NewLine & "b" & Environment.NewLine & "c" & Environment.NewLine & "[Segundo]" Dim spl() As String = Texto.Split(CChar(Environment.NewLine)) For Index As Integer = 0 To spl.Count - 1 spl(Index) = spl(Index).Trim Next MessageBox.Show(spl.ToList.IndexOf("[Segundo]").ToString)
Lo suyo sería poder hacerlo todo en la misma línea, en esta:
Código
Dim spl() As String = Texto.Split(CChar(Environment.NewLine))
Vale, pues este sería otro modo más reducido. Usando Regex
Código
Dim Texto As String = "[Primero]" & Environment.NewLine & "a" & Environment.NewLine & "b" & Environment.NewLine & "c" & Environment.NewLine & "[Segundo]" Dim spl() As String = System.Text.RegularExpressions.Regex.Split(Texto, Environment.NewLine) MessageBox.Show(spl.ToList.IndexOf("[Segundo]").ToString)