2010-02-14 4 views
5

J'ai un problème avec une instruction foreach dans mon projet. Jusqu'à présent, j'ai le code:Instruction Foreach dans la zone de liste

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); 
     } 
    } 

Je l'ai dans un temporisateur de 1 seconde. Il obtient le nom de l'élément, mais quand il arrive aux instructions if, il dit qu'ils ne correspondent pas, mais ils le font?

+1

Avoir ceci en 1 sec. La minuterie ressemble à beaucoup de travail ... pour quoi faire? Est-ce vraiment nécessaire? il serait préférable d'exécuter ce code * seulement * si la liste a réellement changé (il y a des événements pour ça!). –

+0

C'est parce qu'il y a un bouton d'actualisation, mais je suppose que je pourrais l'avoir à la fin du bouton – Crazyd22

Répondre

6

Première chose, vous modifiez une collection tandis que y fait une itération. Cela ne peut pas fonctionner, donc votre code est fondamentalement brisé.

Il y a plusieurs façons de résoudre ce problème; le plus simple dans votre cas serait de copier la collection d'éléments, itérer sur la copie et la modification (= suppression de) l'original:

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

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

Deuxièmement, vous comparez un object à un string, d'où l'opérateur == ne vérifier l'égalité des références plutôt que de tester l'égalité des chaînes. Utilisez Equals ou effectuez une distribution appropriée.

+0

Hey, j'ai essayé mais je ne reçois pas l'erreur de ce que je ne peux pas convertir un objet en booléen. Aussi, je ne peux pas 'attribuer' à 'i' car c'est une variable 'foreach itération' – Crazyd22

+0

@Crazy: réessayez, en utilisant * mon * code. Vous avez évidemment fait quelque chose différemment parce que mon code ne donne * pas * ces erreurs: je n'attribue pas à la variable de boucle, et je ne convertis pas en un booléen. –

+0

va essayer cela merci – Crazyd22

2

La vérification d'égalité ne fonctionne pas car vous devez d'abord convertir la chaîne en chaîne et effectuer une comparaison de chaîne appropriée.

par exemple.

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

Si vous supprimez des éléments d'une collection d'éléments lors de l'itération de la collection, vous risquez de rencontrer des problèmes. Une façon de contourner ce problème consiste à commencer par le dernier élément et à compter à rebours. Ainsi, les suppressions que vous effectuez n'affectent pas les éléments restants de la collection, par ex.

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