我正在使用foreach循环来为每个对象执行特定任务。问题是,这有时会失败,那么它需要再次执行,依此类推。是否有可能再次对同一个对象执行相同的任务?
稍微想象一下这个问题:
foreach (Foo obj in FooList)
{
obj.DoSomething();
obj.CheckIfSucceded();
}
现在如果CheckIfSucceded()
返回false,我想再次在循环中使用相同的对象,而不是继续前进到下一个。
答案 0 :(得分:3)
答案 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
循环无法实现的)...