C#中合并两个奇数步长顺序相反的for循环咨询
合并两个奇数循环的几种可行方案
嘿,作为C#新手就想着优化重复代码,这点必须给你点个赞!😉 既然两个循环的逻辑完全一样,而且n始终是奇数,咱有几个办法能把它们合并起来,下面给你逐个拆解:
1. 先生成目标序列再遍历(最直观的写法)
你可以先把两个循环里i的所有取值按顺序拼成一个集合,然后用foreach遍历这个集合执行逻辑。用LINQ能很方便地生成这个序列:
int n = 7; // 示例值 // 生成第一部分:从n倒序到1的所有奇数 var descendingPart = Enumerable.Range(1, (n + 1) / 2) .Select(index => n - 2 * (index - 1)); // 生成第二部分:从3正序到n的所有奇数 var ascendingPart = Enumerable.Range(0, (n - 3) / 2 + 1) .Select(index => 3 + 2 * index); // 合并成完整序列并遍历 foreach (int i in descendingPart.Concat(ascendingPart)) { // 这里放你原来的循环体代码 Console.WriteLine(i); // 示例输出:7,5,3,1,3,5,7 }
为啥这么写?因为n是奇数,(n+1)/2正好是1到n之间奇数的个数,通过计算能精准生成倒序的奇数;第二部分直接从3开始按步长2生成到n,避免了筛选的开销。如果觉得LINQ有点陌生,也可以手动用List<int>把所有i值加进去,效果是一样的。
2. 手动控制循环变量(无额外集合,性能略优)
如果不想额外创建集合,咱可以直接用一个循环,通过标志位切换i的增减方向:
int n = 7; bool isDescending = true; int i = n; while (true) { // 执行你的循环体逻辑 Console.WriteLine(i); if (isDescending) { i -= 2; // 倒序走到1之后,切换到正序的起始点3 if (i < 1) { isDescending = false; i = 3; // 如果n是1的话,3已经大于n,直接退出循环 if (i > n) break; } } else { i += 2; // 正序走到n之后退出 if (i > n) break; } }
这种写法全程只操作一个变量i,不需要额外的内存存储序列,适合处理非常大的n(不过一般业务场景下第一种方法完全够用)。
3. 提取循环体为方法(新手友好,代码更整洁)
其实如果不是非要合并成一个循环,把重复的循环体逻辑抽成一个单独的方法,代码会更清晰,也避免了重复:
int n = 7; // 把循环体逻辑单独拎出来 void ProcessNumber(int i) { // 原来的循环体代码 Console.WriteLine(i); } // 原两个循环不变,但现在只需要调用方法 for (int i = n; i >= 1; i -= 2) { ProcessNumber(i); } for (int i = 3; i <= n; i += 2) { ProcessNumber(i); }
这种写法对新手来说最容易理解和维护,哪怕以后要修改循环体逻辑,只需要改一个地方就行,完全符合“不要重复自己”(DRY)的编程原则。
内容的提问来源于stack exchange,提问作者MoneyForNothing
相关产品推荐
相关产品推荐

