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.WriteLine
或MessageBox.Show
的catch 块,看看是否发生任何事情)。
查看数据库日志,看看是否有什么有趣的地方。
另外,请发布方法的完整来源。
【讨论】:
打开异常调试中断非常适合发现这类事情-msdn.microsoft.com/en-us/library/d14azbfh.aspx 是的,但他说这主要发生在不在调试器下运行时,所以这还不够。 我指的是“确保该方法没有抛出任何异常”作为评论 - 我没有发布答案......以上是关于foreach 循环不会遍历列表中的所有项目 - C#的主要内容,如果未能解决你的问题,请参考以下文章