有没有更简洁的方式在C#中编写while循环

时间:2018-10-06 02:59:32

标签: c#

这是我现在拥有的代码:

int rpt = Settings.rpt;
while (rpt > -1)
{
   await ShowPhraseHeading();
   await ShowPhraseDetail();
   await ShowSleep();
   rpt--;
}

我想知道是否还有另一种方式可以做到这一点,例如使用foreach甚至是LINQ会更清洁。

4 个答案:

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