Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将索引更新为循环列表的更优雅的方法?_C# - Fatal编程技术网

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

C# 将索引更新为循环列表的更优雅的方法?,c#,C#,我有一个问题列表,用户将反复讨论,他们可以从任何问题开始,但他们确实有一个顺序,因此为了做到这一点,我只需在数组中维护一个索引,并按如下方式递增: CurrentQuestion = (++CurrentQuestion < questions.Length) ? CurrentQuestion : 0; CurrentQuestion=(++CurrentQuestion 在一个非平凡的表达式中,对很多程序员来说是一个红旗。您需要准确地理解何时应用++,这会使这一行更难阅读,而且可能是

我有一个问题列表,用户将反复讨论,他们可以从任何问题开始,但他们确实有一个顺序,因此为了做到这一点,我只需在数组中维护一个索引,并按如下方式递增:

CurrentQuestion = (++CurrentQuestion < questions.Length) ? CurrentQuestion : 0;
CurrentQuestion=(++CurrentQuestion
这里发生的事情并不一定很明显,有没有更优雅的方法

这里发生的事情并不一定很明显,有没有更优雅的方法

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

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

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

//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
重要的一点是,这段代码现在是可读的,并且仍然是优化的。它与其他代码完全相同,我们可以在以后更改部分,而无需大量重读代码

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

  • 始终使用牙套,即使你认为不需要
  • Do
    CurrentQuestion=CurrentQuestion+1而不是
    CurrentQuestion+=1
    CurrentQuestion++或<代码>++当前问题
    
我强烈反对在变量上使用
++
,然后在同一语句中再次使用该变量。我相信这行代码在C#中可以很好地工作,但是像这样的代码在C/C++中是未定义的,所以它们为我升起了一面旗帜。我宁愿

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

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

不需要条件运算符

 CurrentQuestion = ++CurrentQuestion % questions.Length;


但是我想你更喜欢哪一个是风格的问题,而不是其他任何东西。

当然,将该行为抽象成一个具有清晰名称的方法。请注意,你选择的答案仍然与此答案一样不可维护,同样优雅,但具有不同的语义。@jcolebrand-至少答案摆脱了
++
,Lou认为这种惯用方式是正确的。@jcolebrand我不确定我是否同意你关于可维护性的观点……选择的答案是一行代码,并且对它的作用一清二楚。我不知道如何将一行简明代码更改为4行代码和2行注释,从而使代码更易于维护。在某些情况下是的,但是这一行非常清楚,并且可以很容易地保持。<代码> > +> <代码>在一个非平凡的表达式中,对很多程序员来说是一个红旗。您需要准确地理解何时应用
++
,这会使这一行更难阅读,而且可能是错误的。我的回答没有这样的问题,所以我想说这方面更好。再检查一下-我想你当前的版本允许
CurrentQuestion
等于
问题。长度
哇,你说得对,我翻了一下,但忘了加=,谢谢。这就是为什么协作审查很棒:DI觉得使用++或+=在意图上足够明确,你是说你从来没有在代码中使用它们吗?这似乎有点过火了。虽然这个答案的要点很清楚,但示例代码中的逻辑(截至目前……jcolebrand似乎仍在编辑)是不正确的。增量操作(
CurrentQuestion=CurrentQuestion+1
)应该在循环检查之前完成,假设
CurrentQuestion
是一个基于零的索引。我不这么认为,只是因为它们在这里具有相同的效果。我不是说永远不要使用它们,因为我在递增循环计数器时使用它们。我只是在做这样的作业时不使用它们,因为有人可能也想在中途添加其他内容。它只是在某些方面表现得更好。不过,这在技术上会对大型迭代产生影响。@NominSim仅当它要包装时。然而,由于这将需要阵列中比实际安装更多的元素,因此这并不是一个真正的问题。(更准确地说,这将破坏的元素的最大数量)@KirkWoll是的,对不起,这就是我的意思。虽然编译器可能会优化它,但这个答案可能比Lou Franco的答案慢,因为它涉及到两个分配给
CurrentQuestion
:增量中的一个(
++CurrentQuestion
)这是一个不错的选择,我甚至没有考虑过模,但是你是对的。你必须测试“问题。长度”是否大于零,否则,你将得到一个例外。另一个问题:如果当前问题的值比int.MaxValue CurrentQuest大。ion将在int.MinValue处继续。这意味着您将从模中获得负值。您可以使用或uint(当它达到uint.MaxValue时,它将从0开始)。