2015-10-05 25 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)...