我的项目中有一个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
语句时它表示它们不匹配,但它们会匹配吗?
答案 0 :(得分:6)
首先,您正在更改集合,而迭代它。这不起作用,因此您的代码从根本上被打破。
有几种方法可以解决这个问题;在你的情况下,最简单的方法是复制items集合,迭代副本并更改(=删除)原始集合:
var items = new System.Collections.ArrayList(listboxFiles.Items);
foreach (var item in items) {
if (item.Equals("."))
listboxFiles.Items.remove(item);
…
}
其次,您正在将object
与string
进行比较,因此==
运算符确实引用了相等性检查,而不是测试字符串相等性。使用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);
}
}