Listas en bucle

Tengo un problema al usar la lista en los bucles y agradezco si alguno de ustedes puede ayudarme. Quiero crear una lista y llenarla desde una matriz (nombrada en mi código: sarray) con valores mayores que -999. Pero el problema es que cuando los valores son inferiores a -999, el código vuelca los elementos anteriores de la lista y el tamaño en lugar de ser 40, es 27 (como si se creara una nueva lista).

  List<double> nums = new List<double>();
        for (int i = 0; i < 50; i++)
        {
            if (sarray[i] > -999)
            {
                nums.Add(sarray[i]);

            }
        }

estos son los valores:

[31411.0857 31411.0902 31411.0847 31411.0858 31411.0859 31411.0479 31411.0649 31411.0895 31411.0944 31411.0207 31411.0683 31411.0717 31411.075 31411.0825 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 31411.0156 31411.0718 31411.0719 31411.0884 31411.0885 31411.0936 31411.0896 31411.0897 31411.0537 31411.066 31411.0661 31411.0556 31411.0701 31411.0731 31411.0952 31411.0716 31411.0776 31411.0803 31411.091 31411.0911 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 ]

preguntado el 12 de junio de 12 a las 15:06

Muestre un programa breve pero completo que demuestre el problema. -

No entiendo muy bien el problema al que te enfrentas, parece que 27 números de sarray se encuentran las > -999. Recuerda -998 es mayor que -999 -

¿Cuáles son los valores en sarray? -

ok ahora que pasa con el resto de ellos? ¿Puedes publicar los valores por favor? Recuerda que puedes editar tu pregunta. -

@Amir, lo moví a su pregunta, por favor, elimine su último comentario. -

4 Respuestas

Lo que describes no ocurre con el código que has mostrado. Agregará todos los valores en la matriz desde el índice 0 hasta el índice 49 que sean mayores que -999 a la lista.

Si la matriz tiene más de 50 elementos, no utilizará todos los elementos de la matriz. Debe usar la longitud de la matriz en el bucle para obtener todos los elementos:

for (int i = 0; i < sarray.Length; i++)

(Incluso si sabe que la matriz siempre tiene 50 elementos, es una buena idea seguir usando el Length propiedad. De esa manera, la matriz siempre usará la matriz completa incluso si cambia la longitud de la matriz en el futuro).

Edit:

Probé su código con sus datos y la lista termina con 40 elementos.

double[] sarray = {
  31411.0857, 31411.0902, 31411.0847, 31411.0858, 31411.0859, 31411.0479,
  31411.0649, 31411.0895, 31411.0944, 31411.0207, 31411.0683, 31411.0717,
  31411.075, 31411.0825, -999, -999, -999, -999, -999, -999, -999, -999,
  -999, -999, 31411.0156, 31411.0718, 31411.0719, 31411.0884, 31411.0885,
  31411.0936, 31411.0896, 31411.0897, 31411.0537, 31411.066, 31411.0661,
  31411.0556, 31411.0701, 31411.0731, 31411.0952, 31411.0716, 31411.0776,
  31411.0803, 31411.091, 31411.0911, 31411.0919, 31411.0919, 31411.0919,
  31411.0919, 31411.0919, 31411.0919
};

List<double> nums = new List<double>();
for (int i = 0; i < 50; i++) {
  if (sarray[i] > -999) {
    nums.Add(sarray[i]);
  }
}

Console.WriteLine(nums.Count);

Salida:

40

Respondido el 20 de junio de 20 a las 10:06

¡Esto es Loco! Funciona cuando creo el nuevo código. pero cuando uso las mismas cosas en mi código original, ¡otra vez me da 27! ¡Creo que hay un error! ¡Lo siento mucho! - usuario1192781

La lista genérica toma un enumerable en uno de sus constructores sobrecargados, y puedes usar Linq Where método de extensión para restringir los elementos a agregar:

var nums = new List<double>(sarray.Where(d => d > -999));

Dices que -999 representa un valor "nulo" para usted, en ese caso podría cambiar el Where para no asumir que los valores válidos son mayores que -999:

var nums = new List<double>(sarray.Where(d => d != -999));

Creo que este estilo expresa la intención más claramente que crear tus propios bucles.

Como un aparte, double.NaN podría ser una representación más obvia de un valor no válido.


Pero el problema es cuando los valores son menores a -999

Esto se debe a que solo está verificando dónde los valores son mayores que -999: if (sarray[i] > -999)

Sin embargo, el volcado de valor que proporcionó no tiene ningún elemento que sea inferior a -999, por lo que esta verificación será suficiente, siempre que el conjunto de datos siga siendo el mismo.

Respondido el 12 de junio de 12 a las 18:06

Creo que solo quiere agregar ciertos elementos a la lista (aunque no mi voto negativo) - Eric J.

@EricJ. Modificado, fui directamente al código y leí la propaganda demasiado rápido jajaja - adam houldsworth

@EricJ. En ese caso, los votantes negativos deberían volver a pasar y ser tan constructivos como usted; ahora mi respuesta perfectamente válida está incorrectamente rechazada. Ojalá tuviéramos la capacidad de @ downvoters lol - adam houldsworth

@KirkWoll Lo arreglé bastante rápido, aún puede eliminar su voto negativo. Y sí, sé que está roto, es por eso que dejé el comentario; con suerte, los transeúntes leerán el contenido antes de asumir que un elemento votado negativamente necesita más votos negativos. - adam houldsworth

Chicos, gracias por la ayuda. Realmente aprecio toda su amabilidad :) - usuario1192781

Algo como esto funciona, sin tener que iterarte a ti mismo:

List<double> nums = (from value in sarray 
                     where (value > -999) select value).ToList<double>();

Respondido el 12 de junio de 12 a las 16:06

Solo para aclarar, esto iterar sarray, simplemente lo hace por ti. - adam houldsworth

@AdamHouldsworth Tiene razón, mala elección de palabras, obviamente, cualquier solución iterará sarray. - NominSim

Utilizar esta:

List<double> nums = new List<double>(sarray.Where(x => x > -999));

Respondido el 12 de junio de 12 a las 19:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.