You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:22:17