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