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
相关产品推荐
相关产品推荐

