【问题标题】:.Net Framework 4.5.1 RemoveAt.Net Framework 4.5.1 RemoveAt
【发布时间】:2014-10-14 22:28:57
【问题描述】:

我已将我的 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);  

非常感谢您的建议

【问题讨论】:

  • 你不应该改变你正在迭代的集合。
  • 客户端是Collection 而不是IList&lt;T&gt;。没有数组,所以没有索引位置的概念。
  • 请格式化您的代码
  • 你说这是在 .NET 4.0 上工作的,Client 的类型完全相同?这不可能。

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


【解决方案1】:

看来visit.Client 是一个ICollection&lt;T&gt; 并且ICollection&lt;T&gt; 上没有RemoveAt 方法。您可以尝试使用ToList 方法将其转换为列表,或者您可以使用linq 排除您的项目想要:

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

【讨论】:

  • 只有两个小问题。它是ClientId,他还想保留 ClientId == 0
  • 谢谢 Selman,在用户从列表中删除一行后,我正在使用此代码更新列表。所以我正在检查新列表,如果表单集合中没有任何行,我将其删除。所有行都以相同的 id 列出。我想知道为什么它以前在旧应用程序中有效。谢谢。
  • 你说得对,我查了老设计师,visit和client之间的关系是一对多的,而在emdx中是一对一的,这可能是我得到它为ICollection的原因。谢谢
【解决方案2】:

试试这个,诀窍是你必须从下往上移除...

        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;

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多