Principales respuestas
Buscar en un subarray de string

Pregunta
-
Hola.
Cómo encontrar un elemento en un subarray de string? tengo este código:
public static string[] misdatos;
el array "misdatos" se rellena de forma genérica, quedando como sigue:
[0] "1,2,3,4,5,"
[1] "6,7,8,9,10"
[2] "13,14,15,20,42"
etc
int X=45; // nota la variable X va cambiando en cada ciclo
Quiero saber si en la cadena de indice [3] de "misdatos" está el carácter "45". Cómo lo hago?
escribo esta instrucción pero el resultado que arroja no siempre es correcto.¿Porqué? ¿Cómo se corrije?
misdatos[3].Contains(Convert.ToString(X));
Gracias por la atención. Saludos.
Respuestas
-
Hola
Lo llamas así a Contiene() (Contains() de string ya no lo uses porque no sirve para lo que necesitas):
if (Contiene(misdatos[0], X))
acumulador++;
Saludos
- Marcado como respuesta Andres Aguilar MModerator martes, 13 de octubre de 2020 14:43
Todas las respuestas
-
Hola Georgina
if (misdatos[3].Contains(X.ToString())) { ... }
No debería fallar. Si no funciona como esperas, tiene que ser por otro lado el problema.
Otra forma sería:
if (misdatos[3].IndexOf(X.ToString()) > -1) { ... } // devuelve el índice de X o -1 si no existe
Pero la primera es correcta
Saludos
Pablo
-
Cierto.
misdatos[3].Contains(Convert.ToString(X)); y misdatos[3].Contains(X.ToString());son idénticas.
Sin embargo (los resultados obtenidos con las dos expresiones también son idénticos) el valor esperado no es el que arroja la expresión.
(Recordar que el array se rellena con los datos de varias lineas de un txt separado por comas)
Al escribir: " misdatos[1] " nos estamos refiriendo a la segunda linea, es decir, la que en el ejemplo de más arriba tiene los valores: "6,7,8,9,10". Entonces si escribimos: misdatos[1].Contains(X.ToString())) -cuando X toma el valor de 7- debería de darnos true porque el 7 está en el índice 1, verdad?
- Editado GeorginaRomero viernes, 9 de octubre de 2020 0:39
-
-
Hola GeorginaRomero,
¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?
Espero su respuesta.
Gracias por usar los foros de MSDN.
Andres Aguilar
____________________________
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar MSDNFSF@microsoft.com.
-
Hola. Es muy extraño lo que ocurre. El código es extremadamente sencillo y lo he simplificado al máximo y desglosado para mejor comprensión didáctica. He eliminado las partes no representativas y que no influyen para nada en el flujo del programa.
public static string[] misdatos, array2;
public static int[,] array2int;
public static int i; // obsérvese que la variable "i" está declarada como global.
relleno el array "misdatos" cargando un fichero .txt con tres lineas de datos numéricos separados por comas:
linea1: 1,2,3,4,5
linea2: 6,7,8,9,10
linea3: 11,12,13,14,15
NOTA: las palabras linea1, linea2 y linea3, evidentemente no aparecen en el .txt
Relleno el array2 cargando un txt también con varias lineas de datos numéricos separados por comas.
Se llama a una clase y se pasan los datos string de los arrays separados por comas a datos de tipo int[,].
private void btnBUSCAR_Click(object sender, EventArgs e)
{for (i = 0; i < array2.GetLength(0); i++) //recorrer todas las filas del array2
{
Buscador();
}}
private void Buscador()
{
int i2 = i; // para no mezclar.
int X = array2int[i2, 0];
bool x = misdatos[0].Contains(X.ToString());
bool y = misdatos[1].Contains(X.ToString());
bool z = misdatos[2].Contains(X.ToString());}
Debería de funcionar correctamente. Al depurar puede observarse:
PPuede obervarse la incongruencia de las variables booleanas para cuando X vale 1 y para cuando vale 2.
SSaludos a todos.
-
Hola Georgina
Los valores que se observan en las 2 imágenes que mostras son correctos.
Cuando X = 1, el string "1" está en las 3 posiciones de misdatos, en [0] tenes el 1, en [1] tenes el 10 (que contiene un 1), y en [2] tenes todos. Por eso, cuando X = 1, x, y, y z valen true.
Cuando X = 2, el string "2" está en las posiciones [0], en 2, y en [2], en 12, no así en [1]. Por eso, para X = 2, x y z valen true e y vale false.
Era esto solo el problema? Si es algo más por favor avisame.
Saludos
-
Gracias por la respuesta Tigre Pablito.
Ahora comprendo !!!!
Para X=1, da igual donde se encuentre el "1", puesto que busca cualquier expresión que contenga un "1" independiente de si va solo o acompañado. O sea, que es lo mismo un "1", que un "10" que un "01"
Y precisamente eso no es lo que quiero. Lo que quiero es que me encuentre solo un "1".
Cómo debo escribir el código para que me encuentre solo un "1"?
Gracias.
-
Si "sólo un 1" quiere decir sólo el número rodeado por comas o al principio o al final de cada string del array 'misdatos', como se ve en tu ejemplo ("1, 2, 3, 4, 5"), entonces con lo siguiente:
private bool Contiene(string linea, int numero) { int indice; if ((indice = linea.IndexOf(numero.ToString())) > -1 && (indice == 0 || linea[indice - 1] == ',') && (linea.EndsWith(numero.ToString()) || linea[indice + numero.ToString().Length] == ',')) return true; return false; }
Hay otra forma de hacerlo, con Split(), por las comas, pero creo que esta es más eficiente.
Lo que haces es verificar que el número, que puede ser de un dígito o más, esté en el string linea, y que (sea el comienzo de linea o su anterior caracter sea una coma) o (que sea el final de linea o su siguiente caracter sea una coma).
Espero que funcione (no lo probé) y que te sea útil.
-
Gracias, pero una duda.
¿Cómo le paso la variable string al método Contiene?
Se entiende que "linea" es la fila del array, (o sea, el índice del array- en el ejemplo de abajo sería la fila o índice 0-) al cual quiero saber si contiene el número X.
Si la expresión es esta: if (misdatos[0].Contains(X.ToString())) acumulador++; y quiero saber si tiene el numero X, cómo llamaría al método "Contiene") --> Contiene(?,X);
Saludos.
-
Hola
Lo llamas así a Contiene() (Contains() de string ya no lo uses porque no sirve para lo que necesitas):
if (Contiene(misdatos[0], X))
acumulador++;
Saludos
- Marcado como respuesta Andres Aguilar MModerator martes, 13 de octubre de 2020 14:43
-
-
Hola GeorginaRomero,
Gracias por confirmar que se ha encontrado una solución a la consulta realizada. Debido a ello, este hilo será cerrado.
Si es necesario, por favor abra un nuevo hilo.
Gracias por usar los foros de MSDN.
Andres Aguilar
____________________________
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar MSDNFSF@microsoft.com.