.Net Framework 4.5.1 RemoveAt

时间:2014-10-14 22:28:57

标签: c# .net asp.net-mvc linq entity-framework

我已将我的MVC应用程序从linq-to-Sql迁移到EF 6.1.1,从.Net Framework 4.0迁移到4.5.1。我使用以下内容从列表中删除项目:

 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);

我不确定这是否正确,但没有得到任何错误;问题是我无法解决此行中的RemoveAt:

  visit.Client.RemoveAt(i);  

非常感谢您的建议

2 个答案:

答案 0 :(得分:0)

似乎visit.ClientICollection<T>RemoveAt上没有ICollection<T>方法。您可以尝试使用ToList方法将其转换为列表,或者您可以使用linq排除所需的项目:

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

答案 1 :(得分: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;