如何实现C#中往返式for循环?求更优雅的优化方案
优雅实现往返遍历的几种方案
你可以通过以下几种方式简化代码,提升可读性,同时去掉冗余的布尔变量:
方案1:用步长变量动态控制方向
用一个step变量控制每次的增量,到达边界时反转步长值,逻辑更紧凑:
static void Main(string[] args) { int i = 0; int step = 1; while (true) { Console.WriteLine(i); // 碰到边界就反转步长 if (i == 10 || i == 0) step *= -1; i += step; Thread.Sleep(20); } }
这种写法把方向控制浓缩到步长变量的反转上,避免了多个独立的if判断,逻辑更清晰,也不需要额外的布尔标记。
方案2:预先生成遍历序列(声明式风格)
如果只需要完成一次往返(0→10→0),可以直接生成完整的遍历序列再遍历输出,可读性拉满:
static void Main(string[] args) { // 先生成0到10的正向序列,再拼接9到1的反向序列 var sequence = Enumerable.Range(0, 11) .Concat(Enumerable.Range(1, 9).Reverse()); foreach (int i in sequence) { Console.WriteLine(i); Thread.Sleep(20); } // 需要无限循环的话,把foreach套进while(true)即可 }
这种写法直接表达了「先遍历0到10,再遍历9到0」的意图,几乎不需要注释就能理解,适合逻辑明确的场景。
方案3:数学公式计算(无状态实现)
利用三角波公式直接计算每一步的i值,不需要边界判断就能生成往返序列:
static void Main(string[] args) { int max = 10; int stepCount = 0; while (true) { // 通过取模和绝对值生成往返的数值 int i = max - Math.Abs(max - stepCount % (2 * max)); Console.WriteLine(i); stepCount++; Thread.Sleep(20); } }
这种方式不需要维护任何状态变量,适合对性能要求较高或者不想管理边界判断的场景。
内容的提问来源于stack exchange,提问作者Reb
相关产品推荐
相关产品推荐

