foreach循环无法遍历列表中的所有项 - C#

3

我有一个基本的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。

更新

无论是否调试应用程序,该过程都不会抛出任何异常。


14
请提供一个小而完整的示例,展示出问题所在。 - Andrew Hare
4
可能完全错误,但是您是否需要进行清理操作,并且调试文件夹中的程序集版本与应用程序文件夹中的版本不同。 - ryber
1
你是否正在使用多线程? - Aaron Daniels
你确定在 foreach 循环周围没有 try..catch 语句捕获异常吗? - BlackTigerX
@Aaron Daniels - 我没有使用多线程。 - Michael Kniskern
5个回答

4
我的猜测是,当你逐行执行代码时,你的代码可能会表现得不同。(可能是由于数据库)。请确保该方法没有抛出任何异常(放置一个调用Console.WriteLine或MessageBox.Show的catch块,看看是否有任何反应)。查看数据库日志,看看是否有任何有趣的内容。此外,请发布该方法的完整源代码。

2
将异常调试中断打开对于发现这类问题非常有帮助- http://msdn.microsoft.com/en-us/library/d14azbfh.aspx - RichardOD
是的,但他说这主要发生在不在调试器下运行时,所以这还不够。 - SLaks
我在提到“确保该方法不会抛出任何异常”的评论-我没有发布答案... - RichardOD

2

通常情况下,代码正常运行和代码调试时的差异与安全上下文有关。

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

当代码正常运行时,对数据库的调用可能会因权限不足而失败。然后,循环似乎只运行一次。


1

当我没有调试应用程序时,它没有通过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 的工作方式 ;)) - peterchen
这个回答难道不足以澄清吗? - Michael Kniskern

0

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

在我的情况下,我有一个Boat类型对象的列表。(带有boatType、cost、remark等) 我只想添加不存在的新船只类型。

这是原始代码,它没有起作用:

//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循环)不起作用,尽管它看起来是正确的!


0

对我来说,这听起来像是一个异常。为了确保,您是否在调试 - 异常中检查了所有内容?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接