2013-09-10 1 views
1

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

tempLabID = lstLab; 
        foreach (string labID in lstLab) 
        { 
         if (fr.GetFileRecipients(fsID).Contains(labID)) 
         { 
          tempLabID.Remove(labID); 
         } 
        } 

Когда я отлаживать и смотреть lstLab и я получаю tempLabID.remove() она изменяется lstLab до 0 от 1, и затем, в свою очередь, когда он вернется в foreach, я получаю сообщение о том, что коллекция была изменена.

Я не могу понять, почему это происходит. Я изменяю другую коллекцию.

+1

возможно дубликат [System.InvalidOperationException: Коллекция была изменена ошибка] (http://stackoverflow.com/questions/17963376/system-invalidoperationexception-collection-was-modified -error) – wonko79

ответ

1

вы не можете этого сделать.

Изменение

tempLabID = lstlab;

в

tempLabID = lstLab.ToList();

5

Нет, вы изменяете ту же коллекцию. У вас есть две переменные, указывающие на одну и ту же коллекцию. Ваша первая строка должна клонировать коллекцию, чтобы она работала.

Вы можете изменить свой код так, что у вас нет этой проблемы:

lstLab.RemoveAll(labID => fr.GetFileRecipients(fsID).Contains(labID)); 

Это удалит все те, которые вы хотите удалить, без необходимости петель или временных копий.

1

Вы не изменяете другую коллекцию, так как оба tempLabID и lstLab указывают на эту же коллекцию.

Try:

tempLabID = lstLab.ToList(); 
0

Вы изменяете ту же коллекцию, потому что tempLabID = lstLab скопировать ссылку (указатель) на сбор, но не клонировать коллекции.

Вы, вероятно, хотите, чтобы клонировать коллекцию:

tempLabID = lstLab.ToArray(); 
+0

'ToArray' не будет работать, потому что OP использует' tempLabID.Remove'. – dasblinkenlight

0

Это позволит решить вашу проблему:

tempLabID = lstLab.Where(l => fr.GetFileRecipients(fsID).Contains(l)).ToList(); 

Для дальнейшего объяснения чтения Jon Skeets answer

0

В этой ситуации, я обычно просто петли через список назад. (Не очень фантазии, но это работает.)

for (int x = lstLab.Count - 1; x >= 0; x--) 
    { 
     string labId = lstLab[x]; 
     if (fr.GetFileRecipients(fsID).Contains(labID))   
      lstLab.RemoveAt(x);   
    } 
Смежные вопросы