Foreach не проходит через все элементы? - PullRequest
3 голосов
/ 14 июля 2010

У меня есть этот код:

       foreach (var item in ListView1.Items)
            {
                ListView1.Items.Remove(item);
                ListView21.Items.Add(item);
            }

цикл останавливается на половине элементов?

Есть идеи?

РЕДАКТИРОВАТЬ

Хорошо,возможно, это моя ошибка, мне нужно уточнить, что это элемент управления UltraListView от Infrajistics, где я не могу добавить элемент в другой список, пока не удалю или не клонирую его из исходного списка.

Но, спасибо, большинствокомментарии относительно не изменяют список в цикле были правильными, поэтому этот код работает:

           foreach (var item in listView1.Items)
            {
                var i = item.Clone(true);
                listView2.Items.Add(i);
            }
            listView1.Items.Clear();

Спасибо,

Ответы [ 8 ]

15 голосов
/ 14 июля 2010

Вы не можете изменить итеративную коллекцию, она должна умереть с исключением (или с неопределенным поведением).Попробуйте сделать копию массива:

   foreach (var item in ListView1.Items.ToArray())
   {
       ListView1.Items.Remove(item);
       ListView21.Items.Add(item);
   }

РЕДАКТИРОВАТЬ:

на самом деле, ваш пример кода может быть достигнуто написав:это НЕ ТОЧНО, что вы делаете, но дает тот же результат, и я думаю, что вас не будет беспокоить наличие одного и того же контента в обоих списках просмотра на мгновение).Последнее поддерживается начиная с .NET2.0, для первого решения требуется linq, и, следовательно, .NET3.5.

9 голосов
/ 14 июля 2010

Вы изменяете коллекцию, которую просматриваете.Попробуйте использовать оператор for сверху вниз (от элемента с самым высоким индексом до 0).

for (int i = ListView1.Items.Count - 1; i >= 0; i--)
{
    var item = ListView1.Items[i];
    ListView1.Items.Remove(item);
    ListView21.Items.Insert(0, item);
}
2 голосов
/ 14 июля 2010

Это вызовет исключение во время выполнения, жалуясь на то, что вы не можете изменить коллекцию во время итерации. Вместо этого вы должны использовать цикл for.

for(int index = Items.Count; index > 0; index--)
{
    .......
    // use Add and RemoveAt
}

РЕДАКТИРОВАТЬ: Как упоминалось другими. Если вам просто нужно переместить предметы из одной коллекции в другую. AddRange и Clear будут лучше.

0 голосов
/ 14 июля 2010

Вы просматриваете все элементы, удаляете их все, затем добавляете их в другой список.Как прокомментировали другие, вы не можете удалять элементы из списка для каждого.Почему бы не перебрать все элементы, чтобы добавить их в другой список, а затем удалить их все за один раз?

foreach (var item in ListView1.Items)
{
    ListView21.Items.Add(item);
}
ListView1.Items.Clear();   // remove all

PS: это просмотр списка ASP.NET или просмотр списка WinForms?

0 голосов
/ 14 июля 2010

Почему бы просто не CopyTo () в новый список, а затем Очистить () элементы?

0 голосов
/ 14 июля 2010

Это похоже на элемент управления представлением списка WinForms, поэтому:

ListViewItem[] items = ListView1.Items.ToArray();
ListView1.Items.Clear();
ListView21.Items.AddRange(items);
0 голосов
/ 14 июля 2010

Это потому, что вы меняете коллекцию внутри цикла.Используйте цикл for следующим образом:

for(int i=0; i < ListView1.Items.Count-1; i++)
{
       ListView21.Items.Add(ListView1.Items[i]);
       ListView1.Items.RemoveAt(i);
}
0 голосов
/ 14 июля 2010

Вы получаете какое-либо исключение или сообщение об ошибке? Зацикливание в коллекции и удаление элементов из одной коллекции всегда плохая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...