2010-02-14 38 views
5

我在项目中遇到了foreach语句的问题。到目前为止,我的代码是:列表框中的foreach语句

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

我在1秒计时器中有这个。它得到的项目名称是好的,但是当它得到if声明它说他们不匹配,但他们呢?

+1

在1秒内完成。定时器听起来像很多工作......为了什么?这真的有必要吗?执行此代码会更好*仅当列表实际发生更改时(有事件发生!)。 – 2010-02-14 11:23:06

+0

这是因为有一个刷新按钮,但我想我可以在按钮末端 – Crazyd22 2010-02-14 11:32:00

回答

6

首先,你正在改变一个集合,而迭代它。这是行不通的,所以你的代码从根本上破坏了。

有几种方法可以解决这个问题;你的情况最简单的将是复制的项目集合,遍历复制和改变(=从拆除)原:

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

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

其次,你是比较的objectstring,因此==符不引用相等性检查而不是测试字符串相等性。要么使用Equals要么做适当的演员。

+0

嘿,我试过这个,但我没有得到我无法将对象转换为布尔的错误。 '即时获取'不能分配给'我',因为它是一个'foreach迭代变量' – Crazyd22 2010-02-14 11:25:07

+0

@疯狂:再次尝试,使用*我的*代码。你显然做了一些不同的事情,因为我的代码不*给出这些错误:我没有分配给循环变量,也没有转换为布尔值。 – 2010-02-14 11:30:43

+0

将试试这个谢谢 – Crazyd22 2010-02-14 11:32:30

2

相等性检查不起作用,因为您应该先强制转换字符串并进行适当的字符串比较。

例如

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

如果您在遍历集合时从项目集合中删除项目,则可能会遇到麻烦。解决此问题的一种方法是从最后一项开始并向后计数,因此所做的任何删除都不会影响集合的其余项目,例如,

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