.Net Framework 4.5.1 RemoveAt

本文关键字:RemoveAt Framework Net | 更新日期: 2023-09-27 18:26:27

我已经将MVC应用程序从linq迁移到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);  

非常感谢您的建议

.Net Framework 4.5.1 RemoveAt

似乎visit.ClientICollection<T>,而ICollection<T>上没有RemoveAt方法。您可以尝试使用ToList方法将其转换为List,也可以使用linq排除您想要的项目:

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

试试这个,诀窍是你必须从下往上删除。。。

        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;