Оператор Foreach в списке - PullRequest
       20

Оператор Foreach в списке

5 голосов
/ 14 февраля 2010

У меня проблема с оператором 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, он говорит, что они не совпадают, но они соответствуют?

Ответы [ 2 ]

6 голосов
/ 14 февраля 2010

Во-первых, вы меняете коллекцию , а перебираете ее. Это не может работать, поэтому ваш код в корне сломан.

Есть несколько способов исправить это; самое простое в вашем случае - скопировать коллекцию предметов, повторить копию и изменить (= удалить из) оригинал:

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

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

Во-вторых, вы сравниваете object с string, поэтому оператор == выполняет проверку равенства ссылок, а не проверку на равенство строк. Либо используйте Equals, либо сделайте соответствующий бросок.

2 голосов
/ 14 февраля 2010

Проверка на равенство не работает, потому что сначала нужно привести к строке и выполнить соответствующее сравнение строки.

, например

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...