2015-10-05 89 views
1

我正在使用foreach循环为每个对象执行特定的任务。问题是,这有时会失败,然后需要再次执行,等等。是否有可能再次对同一个对象执行相同的任务?在foreach中多次使用对象

为了形象这个问题有点:

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

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

+0

你为什么不使用循环标准? –

+0

“停止尝试”的条件是什么?或者它必须“接受”? –

回答

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) 
} 

或者,如果你喜欢使用whiledo while,你可以这样做:

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

如何:

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

这是一个do while环一个完美的用例。

+3

除非它从来没有成功:) –

+0

@Kędrzu未指定... –

+0

@Kędzru你能否详细说明你的评论?如果方法“DoSomething”可以改变对象的状态,我在这里看不到问题。 –

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(); 
    } 
} 

下面是一个更加“复杂”的方式来处理每运行,并在总的最大失败数可禁用:

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; 
} 
+0

在循环中将'failCount'设置回0? (我可以看到它是以任何方式完成的 - 取决于maxFailCount是整个集合的最大值还是每个对象的最大值)(不是我的downvote) –

+1

为什么在那里调用和检查两次?除非我错过了一些似乎不必要的复杂。 – Octopoid

1

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

 var enumerator = FooList.GetEnumerator(); 

     enumerator.MoveNext(); 

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

这样你就可以只使用一个while回路和控制时,移动到下一个对象时,此循环中(东西是不可能与普通foreach loop)...