2014-10-14 6 views
0

Я перенесла свое приложение MVC из linq-to-Sql в EF 6.1.1 и из .Net Framework 4.0 в 4.5.1. Я использовал следующие для удаления элементов из списка:.Net Framework 4.5.1 RemoveAt

List<int> idsToKeep = new List<int>(); 
    for (int i = 0; i < visit.Client.Count; i++) 
       { 
       Client om = visit.Client[i]; 
       if (om.ClientId == 0) 
        continue; 
       bool itemExists = false; 
       foreach (int id in idsToKeep) 
        if (om.ClientId == id) 
         itemExists = true; 
       if (!itemExists) 
        { 
        visit.Client.RemoveAt(i); 
        i--; 
        } 
       } 
        return errors; 
      } 

Первоначально я получил эту ошибку:

cannot apply indexing with to an expression of type system.collections.generic.iCollection 

в этой строке:

Client om = visit.Client[i]; 

изменил его:

Client om = visit.Client.ElementAt(i); 

Я не уверен, что это правильно, howev er не получил никакой ошибки; проблема в том, что я не могу решить RemoveAt в этой строке:

visit.Client.RemoveAt(i); 

Оценил ваши предложения

+2

Вы не должны изменять коллекцию, которую вы итерируете. –

+0

Клиент является 'Collection', а не' IList '. Нет массива, поэтому нет понятия позиции индекса. –

+0

Отформатируйте свой код –

ответ

0

кажется visit.Client является ICollection<T> и там нет RemoveAt метода на ICollection<T> .ВЫ могут попробовать использовать ToList метод, чтобы включить это в список, или вы можете использовать LINQ, чтобы исключить элементы, которые вы хотите:

visit.Client = visit.Client.Where(x => x.ClientId == 0 || 
             idsToKeep.Contains(x.ClientId)).ToList(); 
+0

Только две незначительные проблемы. Это 'ClientId', и он хочет сохранить также ClientId == 0 – Steve

+0

Спасибо Selman, я использую этот код для обновления списка после того, как пользователь удалит строку из списка. Поэтому я проверял новый список, и если какая-либо строка не находится в коллекции форм, я удаляю ее. Все строки перечислены с одним и тем же идентификатором. Мне интересно, почему это было раньше в старой заявке. Спасибо. – hncl

+0

Вы правы, я проверил старого дизайнера, отношение между посещением и клиентом было от одного до многих, в то время как в emdx есть один к одному, возможно, это причина, по которой я получил его как ICollection. благодаря – hncl

0

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

 var visit = new Visit(); 
     List<int> idsToKeep = new List<int>(); 
     visit.Client.Reverse(); 
     foreach(var thing in visit.Client){ 
      Client om = thing; 
      if (om.ClientId == 0)continue; 
      bool itemExists = false; 
      foreach (int id in idsToKeep) 
       if (om.ClientId == id) 
        itemExists = true; 
      if (!itemExists) 
      { 
       visit.Client.Remove(thing); 
      } 
     } 
     return errors; 
Смежные вопросы