将索引更新为循环列表的更优雅的方法

本文关键字:方法 列表 索引 更新 循环 | 更新日期: 2023-09-27 18:37:26

我有一个用户将迭代的问题列表,他们可以从任何问题开始,但他们确实有一个顺序,所以为了做到这一点,我只是维护一个数组索引并像这样递增它:

CurrentQuestion = (++CurrentQuestion < questions.Length) ? CurrentQuestion : 0;

这里发生的事情不一定很明显,有没有更优雅的方法可以做到这一点?

将索引更新为循环列表的更优雅的方法

我强烈反对对变量使用++,然后在同一语句中再次使用该变量。 我相信这一行在 C# 中工作正常,但像这样的行在 C/C++ 中是未定义的,所以它们为我举起了一面旗帜。 我宁愿

CurrentQuestion = (CurrentQuestion+1) % questions.Length;

我认为这是在类C语言中进行时钟算术的惯用方式。

这里发生的事情不一定很明显,有没有更优雅的方法可以做到这一点?

虽然对某些人来说不是很明显,但我确切地知道它在做什么。

但是,您可能需要考虑的是,编写可读代码比聪明更重要。代码必须维护,你并不比编译器更聪明。

像这样编写代码,并对此感到满意:

//ensure that the CurrentQuestion counter increments and loops back around after hitting "list max"
CurrentQuestion = CurrentQuestion + 1;
if (CurrentQuestion >= questions.Length) {
  CurrentQuestion = 0;
} // meta-comment: use braces incase you have to add more later

重要的一点是,这段代码现在是可读的,并且仍然经过优化。它完全按照其他代码的作用执行,我们可以稍后更改部分,而无需大量重新读取代码。

还要注意我在这里使用的一些语义。

  • 始终使用牙套,即使您认为不需要它们。
  • 执行CurrentQuestion = CurrentQuestion + 1;而不是CurrentQuestion += 1;CurrentQuestion++;++CurrentQuestion;,因为第一个在意图上更加明确。始终编写有意图的代码。

不需要条件运算符

 CurrentQuestion = ++CurrentQuestion % questions.Length;

但我想你更喜欢哪一个是风格问题,而不是其他任何事情