none
Buscar en un subarray de string RRS feed

  • 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.

    jueves, 8 de octubre de 2020 22:35

Respuestas

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

    jueves, 8 de octubre de 2020 22:55
  • 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?


    viernes, 9 de octubre de 2020 0:37
  • Si, verdad ... pero probablemente sucede alguna otra cosa, como que en el momento del if el índice de 'misdatos' no es 1 o X no vale 7.

    Podrías mostrar algo más del código para tener una idea más completa y ver que ocurre?

    viernes, 9 de octubre de 2020 0:53
  • 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. 

    viernes, 9 de octubre de 2020 15:17
    Moderador
  • 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.

    viernes, 9 de octubre de 2020 16:55
  • 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

    viernes, 9 de octubre de 2020 19:20
  • 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.

    viernes, 9 de octubre de 2020 21:14
  • 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.

    viernes, 9 de octubre de 2020 22:17
  • 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.

    lunes, 12 de octubre de 2020 14:31
  • 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


    lunes, 12 de octubre de 2020 15:51
  • Nuevamente GRACIAS.

    Funciona perfectamente.

    Cordiales Saludos a todos.

    lunes, 12 de octubre de 2020 16:14
  • 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. 

    lunes, 12 de octubre de 2020 16:43
    Moderador