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

C# 有没有更简洁的方法在C中编写while循环#,c#,C#,以下是我现在掌握的代码: int rpt = Settings.rpt; while (rpt > -1) { await ShowPhraseHeading(); await ShowPhraseDetail(); await ShowSleep(); rpt--; } 我想知道是否有另一种方法可以做到这一点,它会更干净一些,比如使用foreach或甚至LINQ。您可以使用for循环 for (int rpt = Settings.rpt; rpt > -

以下是我现在掌握的代码:

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

我想知道是否有另一种方法可以做到这一点,它会更干净一些,比如使用foreach或甚至LINQ。

您可以使用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();
}
var设置=新列表();
...
foreach(设置中的变量设置)
{
等待ShowPhraseHeading();
等待ShowPhraseDetail();
等待显示睡眠();
}

您可以这样写:

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

更简洁?我想你已经接近极限了;我能真正消除的唯一一行是
rpt--(通过将其提起:
而(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()
应在每个块内顺序发生,而块本身将并行运行。如果您希望/需要按顺序运行所有内容,那么是否可以使用此选项?(我个人更喜欢您现有的代码样式):

注意:我选择不向后迭代,因为它在您的特定情况下似乎并不重要
.Reverse()
如果您需要在任何点更改方向,则可能是合适的


假设一个人选择并行运行,那么最好查看帖子,以限制最大并行度。

我不知道更简洁的说法,但当必须初始化和/或递增/递减循环变量时,我真的认为对
循环使用
更有意义,这样所有的逻辑都可以组合在一个结构中

int rpt;

for (rpt = Settings.rpt; rpt >= 0; i--)
{
   await ShowPhraseHeading();
   await ShowPhraseDetail();
   await ShowSleep();
}

谢谢,但在您的示例中,它向上计数,而我的代码向下计数。我认为这无关紧要,如果您不使用变量“rpt”,但我将更新代码您可以在
中向上或向下计数。
for
有三个部分,一个是初始化部分,一个是决策部分(如果bool是
true
,它将继续循环),另一个是在循环块的每次传递结束时运行的部分。您可以进行循环计数(正常情况下)、倒计时或执行几乎任何其他操作。
int rpt;

for (rpt = Settings.rpt; rpt >= 0; i--)
{
   await ShowPhraseHeading();
   await ShowPhraseDetail();
   await ShowSleep();
}