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

时间:2012-06-15 20:01:18

标签: c#

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

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

这里发生的事情并不一定明显,是否有更优雅的方式来做到这一点?

3 个答案:

答案 0 :(得分:12)

我强烈反对在变量上使用++,然后在同一语句中再次使用该变量。我相信这行在C#中运行良好,但是这样的行在C / C ++中是未定义的,所以它们为我举起了一个标志。我更喜欢

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

我认为这是用C语言进行时钟算术的惯用方法。

答案 1 :(得分:3)

  

这里发生的事情并不一定明显,是否有更优雅的方式来做到这一点?

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

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

像这样编写代码,并对它感到高兴:

//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;,因为第一个更明确意图。总是写有意义的代码。

答案 2 :(得分:0)

不需要条件运算符

 CurrentQuestion = ++CurrentQuestion % questions.Length;

但我想你更喜欢哪一种风格比什么都重要