foreach 循环不会遍历列表中的所有项目 - C#

Posted

技术标签:

【中文标题】foreach 循环不会遍历列表中的所有项目 - C#【英文标题】:foreach loop does not loop through all item in list - C# 【发布时间】:2010-11-30 12:58:03 【问题描述】:

我有一个基本的foreach 循环,它调用一个静态方法,该方法与数据库建立连接并插入一些数据。出于某种原因,当我在不调试的情况下运行应用程序时,它只会遍历集合中的第一项。如果我调试应用程序并在 foreach 循环上设置断点,它将遍历集合中的所有项目。

如果我设置断点并跳过foreach 循环,它将演示与我在未调试的情况下运行应用程序相同的行为。

有谁知道什么会导致这种行为?

这里是简化版的源代码:

List<MyObject> objectlist = new List<MyObject>();

//some code to populate list

foreach(MyObject myobject in objectlist)

    string a = "a";
    string b = "b";

    MyLibrary.UpdateDatabase(a, b);

(我使用的是 Visual Studio 2008 SP1)

更新

无论是否调试应用程序,该进程都不会引发任何异常。

【问题讨论】:

请发布一个小而完整的示例来演示该问题。 这可能完全关闭,但可能是您需要清理,并且调试箱中的程序集版本与应用程序箱中的不同 你在使用多线程吗? 确保你没有 try..catch 围绕可能正在吃异常的 foreach? @Aaron Daniels - 我没有使用多个线程 【参考方案1】:

我遇到了同样的问题。 (foreach 循环正在返回第一项......) 我只是通过将“foreach”循环更改为“for”循环来解决它,并使用 [i] 检查列表中的每个索引(这会强制循环按每个项目遍历列表)..

就我而言,我有一个船类型的对象列表。 (带有船型、成本、备注等) 而且我只想添加不存在的新boatTypes。

这是无效的原始代码:

//data access layer
DALInventory dalGear = new DALInventory();

public bool AddBoat(Boat boat)

     foreach (var item in AllBoats())
                
                    if (item.BoatType == gear.BoatType)
                    
                        //if boatType already exists
                        return false;
                    
                
                //if boatType doesn't exist
                dalGear.AddBoat(gear);
                return true;

这是解决我的问题的代码(for循环):

for (int i = 0; i < AllBoats().Count; i++)
                
                    Boat b = new Boat();

                    b.BoatType = AllBoats()[i].BoatType;

                    if (b.BoatType == gear.BoatType)
                    
                        return false;
                    
                

                dalGear.AddBoat(gear);
                return true;

我仍然不明白为什么第一个代码(foreach 循环)不起作用,即使它似乎是正确的!

【讨论】:

【参考方案2】:

对我来说,这听起来像是个例外。可以肯定的是,您是否检查了 Debug - Exceptions to On 中的所有内容?

【讨论】:

【参考方案3】:

通常情况下,正常运行的代码和debug运行的代码存在差异,与安全上下文有关。

在进程中运行的代码将在该进程的安全上下文中运行。在调试模式下运行的代码将在进行调试的用户的安全上下文中运行。

代码正常运行时,由于权限不足,可能调用数据库失败。然后看起来循环只运行一次。

【讨论】:

【参考方案4】:

当我没有调试应用程序时,它没有遍历foreach 循环,因为UpdateDatabase 方法调用中没有使用myobject 对象。

我的源代码应该是这样的:

List<MyObject> objectlist = new List<MyObject>();

//some code to populate list

foreach(MyObject myobject in objectlist)

    MyLibrary.UpdateDatabase(myobject.a, myobject.b);

【讨论】:

请在您澄清后更新您的原始问题(这就是 SO 的工作方式;)) 这个答案还不够澄清吗?【参考方案5】:

我的猜测是,当您通过逐步执行每一行来给它更多时间时,您的代码的行为可能会有所不同。 (估计是数据库的原因)

确保该方法没有抛出任何异常(放置一个调用Console.WriteLineMessageBox.Show 的catch 块,看看是否发生任何事情)。

查看数据库日志,看看是否有什么有趣的地方。

另外,请发布方法的完整来源。

【讨论】:

打开异常调试中断非常适合发现这类事情-msdn.microsoft.com/en-us/library/d14azbfh.aspx 是的,但他说这主要发生在不在调试器下运行时,所以这还不够。 我指的是“确保该方法没有抛出任何异常”作为评论 - 我没有发布答案......

以上是关于foreach 循环不会遍历列表中的所有项目 - C#的主要内容,如果未能解决你的问题,请参考以下文章

JS中的forEach,for in,for of和for的遍历优缺点及区别

forEach循环遍历请求接口

使用 For Each 循环遍历列表时删除列表中的项目

在不使用 ForEach 循环的情况下遍历列表

React - 组件不会在 foreach 循环中呈现?

有没有办法在 foreach 循环中遍历命名空间中的所有类型? [复制]