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

C#中如何将两层嵌套for循环转换为等效LINQ语句

嵌套循环转对应LINQ实现方案

原有代码逻辑说明

原嵌套循环的目标是生成所有满足0 ≤ a < b < n的整数对,封装为元组存入列表,等价于从0到n-1的整数中取所有2个元素的无序组合。

错误写法问题

之前尝试的写法中,b的取值序列固定为Enumerable.Range(1, n),没有和当前遍历到的a值绑定,会生成大量b ≤ a、b ≥ n的无效数对,因此结果不符合预期。

正确LINQ实现

查询表达式写法

var list = (
    from a in Enumerable.Range(0, n)
    from b in Enumerable.Range(a + 1, n - a - 1)
    select Tuple.Create(a, b)
).ToList();

参数逻辑说明:

  • Enumerable.Range第一个参数为序列起始值,这里设为a+1,和原内层循环的b初始值完全一致
  • Enumerable.Range第二个参数为序列总长度,这里设为n - a -1,对应从a+1到n-1的元素总个数,和原内层循环的终止条件匹配

方法链写法(SelectMany)

var list = Enumerable.Range(0, n)
    .SelectMany(
        a => Enumerable.Range(a + 1, n - a - 1), 
        (a, b) => Tuple.Create(a, b)
    )
    .ToList();

C# 7+ 简化写法(值元组)

如果项目使用C# 7及以上版本,可以用值元组替代旧的Tuple类型,代码更简洁:

var list = (
    from a in Enumerable.Range(0, n)
    from b in Enumerable.Range(a + 1, n - a - 1)
    select (a, b)
).ToList();

结果验证

以n=3为例,上述LINQ代码生成的元组序列为(0,1)、(0,2)、(1,2),和原嵌套循环的执行结果完全一致。

内容的提问来源于stack exchange,提问作者perceptr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:51:25