列表框中的Foreach语句

时间:2010-02-14 11:15:26

标签: c# listbox 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);
        }
    }

我在一秒计时器中有这个。它可以获得项目名称,但是当它到达if语句时它表示它们不匹配,但它们会匹配吗?

2 个答案:

答案 0 :(得分:6)

首先,您正在更改集合,而迭代它。这不起作用,因此您的代码从根本上被打破。

有几种方法可以解决这个问题;在你的情况下,最简单的方法是复制items集合,迭代副本并更改(=删除)原始集合:

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

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

其次,您正在将objectstring进行比较,因此==运算符确实引用了相等性检查,而不是测试字符串相等性。使用Equals或进行适当的演员表。

答案 1 :(得分:2)

等式检查不起作用,因为您应首先转换为字符串并进行适当的字符串比较。

e.g。

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