2010-02-14 12 views
5

Tengo un problema con una declaración de foreach en mi proyecto. Hasta ahora tengo el código:Declaración de Foreach en el cuadro de lista

foreach(object i in listboxFiles.Items) 
    { 
     if (i == ".ftpquota") 
     { 
      listboxFiles.Items.Remove(i); 
     } 
     if (i == ".") 
     { 
      listboxFiles.Items.Remove(i); 
     } 
     if (i == "..") 
     { 
      listboxFiles.Items.Remove(i); 
     } 
    } 

Tengo esto en un temporizador de 1 segundo. Obtiene el nombre del elemento bien, pero cuando llega a las declaraciones if dice que no coinciden, pero lo hacen?

+1

teniendo esto en un 1 seg. el temporizador suena como un montón de trabajo ... ¿para qué? ¿Es esto realmente necesario? sería mucho mejor ejecutar este código * solo * si la lista realmente cambió (¡hay eventos para eso!). –

+0

Es porque hay un botón de actualización, pero supongo que podría tenerlo al final del botón – Crazyd22

Respuesta

6

En primer lugar, está cambiando una colección mientras que iterando sobre ella. Esto no puede funcionar, por lo que su código está fundamentalmente roto.

Existen varias formas de solucionar esto; el más simple en su caso habría que copiar la colección de artículos, interactuando sobre la copia y el cambio (= quitar de) el original:

var items = new System.Collections.ArrayList(listboxFiles.Items); 

foreach (var item in items) { 
    if (item.Equals(".")) 
     listboxFiles.Items.remove(item); 
    … 
} 

En segundo lugar, se están comparando un object a un string, por lo tanto, el operador == hace verificación de igualdad de referencia en lugar de probar la igualdad de cadena. O use Equals o haga un lanzamiento apropiado.

+0

Oye, lo intenté pero no estoy obteniendo el error de que no puedo convertir un objeto en un bool. También recibo 'No se puede asignar a' i 'porque es una' variable de iteración foreach ' – Crazyd22

+0

@Loco: inténtalo de nuevo, usando el código * my *. Obviamente, has hecho algo diferente porque mi código * no * da estos errores: no asigno a la variable de bucle, y no me convierto a un booleano. –

+0

Lo intentaré gracias – Crazyd22

2

La comprobación de igualdad no funciona porque primero debe convertir en cadena y hacer una comparación de cadena adecuada.

p. Ej.

if (string.Equals((string)i, ".ftpquota", StringComparison.Ordinal)) 

Si se quitan los elementos de una colección de artículos, mientras que la iteración a través de la colección, que bien puede tener problemas. Una forma de evitar este problema es comenzar con el último elemento y contar hacia atrás, por lo tanto, cualquier eliminación que realice no afectará a los elementos restantes de la colección, p.

for(var i = listboxFiles.Items.Count - 1; i >= 0; --i) 
{ 
    var item = listboxFiles[i]; 
    if (...) 
    { 
     listboxFiles.Items.RemoveAt(i); 
    } 
} 
Cuestiones relacionadas