这是我现在拥有的代码:
int rpt = Settings.rpt;
while (rpt > -1)
{
await ShowPhraseHeading();
await ShowPhraseDetail();
await ShowSleep();
rpt--;
}
我想知道是否还有另一种方式可以做到这一点,例如使用foreach甚至是LINQ会更清洁。
答案 0 :(得分:2)
更简洁?我会说你已经接近极限了;我实际上可以消除的唯一一行是rpt--;
(通过提升:while (rpt-- > -1) { ... }
)。我可以想象实现相同逻辑的所有其他方式可以减少简洁的代码。
这应该使用LINQ并行运行您的一组异步方法,以生成任务列表:
var tasks = Enumerable
.Range(0, Settings.rpt)
.Select(async _ => {
await ShowPhraseHeading();
await ShowPhraseDetail();
await ShowSleep();
});
await Task.WhenAll(tasks);
要清楚,ShowPhraseHeading()
,ShowPhraseDetail()
和ShowSleep()
应该在每个块中顺序发生,而块本身将并行运行。如果您希望/需要一切按顺序运行,那么也许可以这样做? (我个人更喜欢您现有的代码样式):
Enumerable
.Range(0, Settings.rpt)
.Select(async _ => {
await ShowPhraseHeading();
await ShowPhraseDetail();
await ShowSleep();
})
.Select(task => task.GetAwaiter().GetResult()) // wait for each block to complete
.ToList(); // a dumb way to force enumeration
注意::我选择不进行向后迭代,因为在您的特定情况下,这似乎无关紧要;如果您需要随时更改方向,则.Reverse()
可能是合适的。
假设选择并行运行某事物,那么最好检查here帖子以限制最大并行度。
答案 1 :(得分:1)
您可以使用for循环
for (int rpt = Settings.rpt; rpt > -1; rpt--)
{
await ShowPhraseHeading();
await ShowPhraseDetail();
await ShowSleep();
}
如果您有“设置”列表或任何枚举,则可以使用foreach循环。
var settings = new List<Settings>();
...
foreach (var setting in settings)
{
await ShowPhraseHeading();
await ShowPhraseDetail();
await ShowSleep();
}
答案 2 :(得分:1)
您可以这样写:
for ( int rpt = Settings.rpt; rpt>-1; rpt-- )
{
await ShowPhraseHeading();
await ShowPhraseDetail();
await ShowSleep();
}
此外,除非您希望依次执行不同的“显示”步骤,否则让它们像这样并行运行会更有效率:
for ( int rpt = Settings.rpt; rpt>-1; rpt-- )
{
await Task.WhenAll
(
ShowPhraseHeading(),
ShowPhraseDetail(),
ShowSleep()
);
}
答案 3 :(得分:0)
我不知道更简洁,但是当必须初始化和/或递增/递减循环变量时,我真的认为使用for
循环更好,以便将所有逻辑分组一起构建。
int rpt;
for (rpt = Settings.rpt; rpt >= 0; i--)
{
await ShowPhraseHeading();
await ShowPhraseDetail();
await ShowSleep();
}