У меня есть проблема с 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
операторы это говорит, что они не соответствуют, но они делают?
Во-первых, вы изменяете коллекцию , пока перебираете ее. Это не может сработать, значит, ваш код в корне не работает.
Есть несколько способов исправить это; самым простым в вашем случае было бы скопировать коллекцию элементов, перебирая копию и изменяя (= удаляя) оригинал:
var items = new System.Collections.ArrayList(listboxFiles.Items);
foreach (var item in items) {
if (item.Equals("."))
listboxFiles.Items.remove(item);
…
}
Во-вторых, вы сравниваете объект
со строкой
, следовательно, оператор ==
выполняет проверку равенства, а не проверку равенства строк. Либо используйте Equals
, либо выполните соответствующее приведение.
Проверка равенства не работает, потому что сначала нужно привести к строке и выполнить соответствующее сравнение строк.
например,
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);
}
}