c# – 更改对象正在影响foreach循环中对象的先前版本

c# – 更改对象正在影响foreach循环中对象的先前版本,第1张

概述所以,我觉得这个很直接. 这是我的代码: Dictionary<int, IEnumerable<SelectListItem>> fileTypeListDict = new Dictionary<int, IEnumerable<SelectListItem>>();foreach (PresentationFile pf in speakerAssignment.FKPresentati 所以,我觉得这个很直接.

这是我的代码:

Dictionary<int,IEnumerable<SelectListItem>> fileTypeListDict = new Dictionary<int,IEnumerable<SelectListItem>>();foreach (Presentationfile pf in speakerAssignment.FKPresentation.Presentationfiles){    IEnumerable<SelectListItem> fileTypes = Enum.GetValues(typeof(PresentationfileType))                .Cast<PresentationfileType>().Select(x => new SelectListItem        {             Text = x.ToString(),Value = Convert.ToString((int)x),Selected = pf.Type == (int)x        });        fileTypeListDict.Add(pf.ID,fileTypes);}

发生的事情是,最后字典将具有所有正确的键,但所有值将被设置为在循环的最后一次迭代期间创建的fileTypes列表.我确信这与用作参考的对象有关,但在我使用C#之前没有看到过这个问题.任何人都在意解释为什么会这样,以及我应该如何解决这个问题?

谢谢!

解决方法 这是臭名昭着的“foreach捕获问题”,并在C#5中“修复”(“固定”是一个强有力的词,因为它表明它之前是一个“BUG”:实际上 – 规范现在改为承认这是混淆的常见原因).在这两种情况下,lambda捕获变量pf,而不是“在此迭代期间pf的值” – 但在C#之前的5中,变量pf在技术上限定在循环外(因此只有其中一个,句点),其中 – 在C#5及更高版本中,变量在循环内部作用域(因此,为了捕获目的,每次迭代都有一个不同的变量).

在C#4中,只是作弊:

foreach (Presentationfile tmp in speakerAssignment.FKPresentation.Presentationfiles){    Presentationfile pf = tmp;    //... as before

现在pf的范围在foreach中,它可以正常工作.没有它,只有一个pf – 并且因为你将执行推迟到结束,所以单个pf的值将是最后一次迭代.

另一种解决方法是:不要推迟执行:

fileTypeListDict.Add(pf.ID,fileTypes.ToList()); // note the ToList

现在它被评估,而pf是“当前”,因此将得到您期望的结果.

总结

以上是内存溢出为你收集整理的c# – 更改对象正在影响foreach循环中对象的先前版本全部内容,希望文章能够帮你解决c# – 更改对象正在影响foreach循环中对象的先前版本所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1248429.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存