多次在foreach中使用对象

时间:2015-10-05 07:34:07

标签: c# foreach

我正在使用foreach循环来为每个对象执行特定任务。问题是,这有时会失败,那么它需要再次执行,依此类推。是否有可能再次对同一个对象执行相同的任务?

稍微想象一下这个问题:

foreach (Foo obj in FooList)
{
     obj.DoSomething();
     obj.CheckIfSucceded();
}

现在如果CheckIfSucceded()返回false,我想再次在循环中使用相同的对象,而不是继续前进到下一个。

4 个答案:

答案 0 :(得分:3)

这个怎么样:

SELECT

这是do while循环的完美用例。

答案 1 :(得分:1)

假设您很高兴再次尝试对同一个对象进行操作,您可以这样做:

foreach (Foo obj in FooList)
{
    do
    {
        obj.DoSomething();
    } while (!obj.CheckIfSucceded())
}

如果您只想尝试一定次数,可以添加一个简单的超时:

foreach (Foo obj in FooList)
{
    int tries = 0;
    do
    {
        obj.DoSomething();
        tries++;
    } while (!obj.CheckIfSucceded() && tries < 5)
}

或者,如果您希望while使用do while,则可以执行此操作:

foreach (Foo obj in FooList)
{
    int tries = 0;
    bool succeeded = false;
    while (!succeeded && tries < 5)
    {
        obj.DoSomething();
        succeeded = obj.CheckIfSucceded();
        tries++;
    }
}

答案 2 :(得分:1)

int failCount = 0;
int maxFailCount = 10;
foreach (Foo obj in FooList)
{
     failCount = 0;
     obj.DoSomething();
     bool succeeded = obj.CheckIfSucceded();
     while(!succeeded && ++failCount <= maxFailCount)
     {
         obj.DoSomething();
         succeeded = obj.CheckIfSucceded();
     }
}

这里有一个更复杂的&#34;处理每次运行的最大失败计数的方法,总共可以禁用:

int maxFailCount = 10;          
int maxTotalFailCount = 100;
bool checkFailCount = maxFailCount > 0;
bool checkTotalFailCount = maxTotalFailCount > 0;

int totalFailCount = 0;
foreach (Foo obj in FooList)
{
    int failCount = 0;
    bool breakLoop = false;
    bool retry = true;
    while (retry)
    {
        obj.DoSomething();
        bool succeeded = obj.CheckIfSucceded();
        if (!succeeded)
        {
            if (checkTotalFailCount && ++totalFailCount > maxTotalFailCount)
            {
                breakLoop = true;
                retry = false;
            }
            else if (checkFailCount && ++failCount > maxFailCount)
            {
                retry = false;   
            }
        }
    }
    if (breakLoop)
        break;
}

答案 3 :(得分:1)

其他想法是“实施自己的foreach”:

        var enumerator = FooList.GetEnumerator();

        enumerator.MoveNext();

        while (enumerator.Current != null)
        {
            enumerator.Current.DoSomething();
            if(!enumerator.Current.CheckIfSucceded()) continue;
            enumerator.MoveNext();
        }

这样你就可以只用一个while循环来控制何时移动到这个循环中的下一个对象(这是常规foreach循环无法实现的)...