gpt4 book ai didi

c# - 我在 foreach 期间收到 "Collection was modified; enumeration operation may not execute."

转载 作者:太空宇宙 更新时间:2023-11-03 22:01:33 28 4
gpt4 key购买 nike

我需要确认我的方法,我正在使用 EF 和 ASP.NET MVC,并且我正在尝试根据用户选择(即基于他们已选中/未选中的内容)删除实体。

为此,我正在查看从复选框中的表单传递的 ID,匹配我在数据库中的内容,然后首先添加任何新的,然后删除任何不匹配的。

下面是我原来的代码:

        [HttpPost]
public ActionResult Edit(int id, FormCollection collection, VMinstanceRole vmodel)
{
try
{
var instancerole = db.instanceRoles.Find(id);

if (ModelState.IsValid)
{
UpdateModel<instanceRole>(instancerole, "instanceRole");
var keys = instancerole.rights.Select( c => c.Id);

foreach (var pid in vmodel.selectedId.Except(keys))
{
var right = new right { Id = pid };
db.rights.Attach(right);
instancerole.rights.Add(right);
}

foreach (var pid in keys.Except(vmodel.selectedId))
{
var right = instancerole.rights.Where(c => c.Id == pid).Single();
instancerole.rights.Remove(right);
}


db.SaveChanges();
}

// TODO: Add update logic here

return RedirectToAction("Index");
}
catch (InvalidCastException e)
{
return View();
}
}

但是,出现以下错误“集合已修改;枚举操作可能无法执行。”

因此,为了尝试解决这个问题,我决定保留一个单独的列表,然后根据列表删除它以克服错误:

        [HttpPost]
public ActionResult Edit(int id, FormCollection collection, VMinstanceRole vmodel)
{
try
{
var instancerole = db.instanceRoles.Find(id);
List<right> removeList = new List<right>();
if (ModelState.IsValid)
{
UpdateModel<instanceRole>(instancerole, "instanceRole");
var keys = instancerole.rights.Select( c => c.Id);

foreach (var pid in vmodel.selectedId.Except(keys))
{
var right = new right { Id = pid };
db.rights.Attach(right);
instancerole.rights.Add(right);
}

foreach (var pid in keys.Except(vmodel.selectedId))
{
var right = instancerole.rights.Where(c => c.Id == pid).Single();
removeList.Add(right);
}

foreach (var right in removeList)
{
instancerole.rights.Remove(right);
}
db.SaveChanges();
}

// TODO: Add update logic here

return RedirectToAction("Index");
}
catch (InvalidCastException e)
{
return View();
}
}

这似乎可行,但是,我不确定我是否做对了。主要是因为我正在做另一个循环。有没有更好的方法来解决这个问题或者这是否足够好?

最佳答案

您找到了一种标准溶液。另一个可行的解决方案是在生成您的键对象的 LINQ 操作上调用 ToList:这样做会断开键与 instanceroles 集合的连接,从而允许对原始集合进行任意独立修改。

关于c# - 我在 foreach 期间收到 "Collection was modified; enumeration operation may not execute.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9906030/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com