3

在下面的 C# 代码片段
中,我在“ while”循环中有一个“ ”循环,我希望在发生特定条件时foreach跳转到“”中的下一项。foreach

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    this.ExecuteSomeCode();
    while (this.boolValue)
    {
        // 'continue' would jump to here.
        this.ExecuteSomeMoreCode();
        if (this.MoveToNextObject())
        {
            // What should go here to jump to next object.
        }
        this.ExecuteEvenMoreCode();
        this.boolValue = this.ResumeWhileLoop();
    }
    this.ExecuteSomeOtherCode();
}

' continue' 会跳转到 ' while' 循环而不是 ' foreach' 循环的开头。这里是否有要使用的关键字,或者我应该只使用我不太喜欢的 goto。

4

5 回答 5

9

使用 break 关键字。这将退出 while 循环并在其外部继续执行。由于您在 while 之后没有任何内容,因此它将循环到 foreach 循环中的下一项。

实际上,更仔细地查看您的示例,您实际上希望能够在不退出 while 的情况下推进 for 循环。您不能使用 foreach 循环执行此操作,但您可以将 foreach 循环分解为它实际自动化的内容。在 .NET 中,foreach 循环实际上呈现为对 IEnumerable 对象(您的 this.ObjectNames 对象是)的 .GetEnumerator() 调用。

foreach 循环基本上是这样的:

IEnumerator enumerator = this.ObjectNames.GetEnumerator();

while (enumerator.MoveNext())
{
    string objectName = (string)enumerator.Value;

    // your code inside the foreach loop would be here
}

一旦你有了这个结构,你就可以在你的 while 循环中调用 enumerator.MoveNext() 来前进到下一个元素。所以你的代码会变成:

IEnumerator enumerator = this.ObjectNames.GetEnumerator();

while (enumerator.MoveNext())
{
    while (this.ResumeWhileLoop())
    {
        if (this.MoveToNextObject())
        {
            // advance the loop
            if (!enumerator.MoveNext())
                // if false, there are no more items, so exit
                return;
        }

        // do your stuff
    }
}
于 2009-03-07T03:55:40.460 回答
4

以下应该可以解决问题

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    this.ExecuteSomeCode();
    while (this.boolValue)
    {
        if (this.MoveToNextObject())
        {
            // What should go here to jump to next object.
            break;
        }
    }
    if (! this.boolValue) continue; // continue foreach

    this.ExecuteSomeOtherCode();
}
于 2009-03-07T10:35:44.083 回答
2

关键字将break;退出循环:

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    while (this.boolValue)
    {
        // 'continue' would jump to here.
        if (this.MoveToNextObject())
        {
            break;
        }
        this.boolValue = this.ResumeWhileLoop();
    }
}
于 2009-03-07T03:55:59.287 回答
1

使用goto.

(我想人们会对这个回复感到生气,但我绝对认为它比所有其他选项更具可读性。)

于 2009-03-07T11:12:04.433 回答
0

你可以使用“break;” 退出最里面的while或foreach。

于 2009-03-07T03:56:16.760 回答