如何“就地”向前移动循环?

时间:2015-03-12 20:11:50

标签: c#

是否有可能"寻求"通过一个循环?基于某些条件,我想做一个"继续到位,"通过循环快进。像这样:

for(var thing in things)
{
  // Do stuff

  if(something)
  {
     // Move iteration forward until the iteration object ("thing") meets the right condition
     while(true)
     { 
       // Move the iteration forward...somehow
       [Missing code goes here]
       if(thing.Property == somevalue)
       {
         break;
       }
     }
  }

  // Do more stuff on the new value of "thing"
}

我可以使用continue,但我不想回到循环的顶部。我想在枚举器中向前循环,然后从我离开的地方继续前进。

我猜这是不可能的。如果没有,那么模仿我想要做的事情的最佳逻辑是什么。

4 个答案:

答案 0 :(得分:5)

您是否考虑使用标准的for循环代替您正在使用的foreach循环?

E.g。

var thing;
for (int i = 0; i < things.Length; i++)
{
    thing = things[i];
    //do stuff
    if(something)
    {
        while([thing doesn't meet condition] && i < things.Length - 1 )
        {
            thing = things[++i];
        }
    }
}

如果您之前(i++)看过增量器,++i可能会显得很奇怪。所有这一切都是在 之前增加i 。因此,如果您在while上输入things[5]循环,则thing将设置为things[6]。如果您无法再加载任何对象,while循环也会中断。

答案 1 :(得分:2)

在循环之前过滤东西

var filtered = things.Where(x => x.Property == somevalue);
foreach ( var thing in filtered )
{
   if (something)
       // Do more stuff on the new value of "thing"
}

答案 2 :(得分:0)

你可以手动迭代迭代器

你可以看看这里:

Using IEnumerable without foreach loop

答案 3 :(得分:0)

您可以“重建”foreach的逻辑。请注意using(因为foreach处置枚举器)

using (var enu = things.GetEnumerator())
{
    bool success;

    while (success = enu.MoveNext())
    {
        // Current value (always "valid"): enu.Current;

        if (something)
        {
            while (success = enu.MoveNext())
            {
                // Current value (always "valid"): enu.Current;

                if (enu.Current == someValue)
                {
                    break;
                }
            }
        }

        // Current value (check success before using it): enu.Current;
        if (success)
        {
            // Do more stuff on the new value of "thing"
        }
    }
}

if (res)是必要的,因为内部while可以“耗尽”调查员。