【问题标题】:Cannot update specific item in list无法更新列表中的特定项目
【发布时间】:2016-09-23 11:16:23
【问题描述】:

我有一个 listView,其中包含一组具有属性 IsFavourite 的项目,我想要做的是将此属性设置为 false,对于在 Where 子句中找到的每个项目。

我做的是这样的:

myListView.Items.Cast<Event>().Where(x => x.MatchLeague == leagueName && x.MatchNation == nationName).Select(c => { c.IsFavourite = false; return c; }).ToList();

所以基本上我将所有具有一定leagueNamenationName 的项目都取走,在这样做之后,我尝试将所有返回IsFavourite 属性的项目设置为false,并将这些项目作为列表返回。

但我得到了这个例外:

由于对象的当前状态,操作无效

我不知道我做错了什么,我过去什至使用过这种类型的代码并且一切正常,发生了什么?谢谢。

【问题讨论】:

  • 这可能对你有帮助:stackoverflow.com/a/3921084
  • 尝试像这样修改对象是对 LINQ 的一种非常丑陋的滥用。 LINQ 是一种查询 语言,而不是一种数据修改语言。只是不要使用这个技巧,要么返回一个新对象,要么修改foreach循环中的项目
  • @PanagiotisKanavos 也有一个 foreach 循环我得到了这个异常,这就是为什么我在这里要求解决这个问题
  • 发布 full 异常,包括调用堆栈,而不仅仅是消息。这将显示实际异常发生的位置以及任何内部异常。您可以通过调用Exception.ToString() 获得完整的例外情况。一般来说,您应该记录整个异常
  • 如果您发布异常详细信息会非常有帮助,但从您发布的内容来看,我的第一个猜测是您的查询以某种方式修改了 myListView.Items 集合(例如,通过绑定、触发器等) .),因此作为快速修复,您可以尝试使用 myListView.Items.ToList() 缓存集合。

标签: c# linq


【解决方案1】:

您得到的异常是由于运行时对象的无效状态,所以您最好的选择是像这样分解您的语句,并检查单个结果的输出,如下所示:

var r1 = myListView.Items.Cast<Event>();

var r2 = r1.Where(x => x.MatchLeague == leagueName && x.MatchNation == nationName);

var r3 = r2.Select(c => { c.IsFavourite = false; return c; });

var r4 = r3.ToList();

这可能对你有点帮助。

您可能还想查看this SO 答案。

【讨论】:

  • r4 上我在r3.toList() 的帖子中得到了例外
  • @Unchained 到底是什么异常?
【解决方案2】:

我不确定您的完整堆栈跟踪是什么,如果您正在处理帖子并且收到最大 http 集合密钥异常,那么您需要将以下内容添加到您的网络配置中......

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="10000" />
</appSettings>

但是,如果这仅与 Linq 查询有关,通常我会在没有找到更改 IE 的匹配记录时看到这种错误:您没有找到任何具有该联盟名和国家名组合的记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2021-12-25
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多