将嵌套For循环转换为LINQ表达式
本文关键字:LINQ 表达式 转换 循环 嵌套 For | 更新日期: 2023-09-27 18:04:21
请考虑以下代码:
private ISet<int> CalcSumsOfTwoNums(IEnumerable<int> nums) {
ISet<int> iset = new HashSet<int>();
var asArray = nums.ToArray();
for (var i = 0; i < asArray.Length - 2; i++) {
for (var j = i; j < asArray.Length - 1; j++) {
var sum = asArray[i] + asArray[j];
if (sum <= MAX) {
iset.Add(sum);
}
}
}
return iset;
}
将嵌套的for
循环语法转换为LINQ表达式或LINQ点符号是否有意义?这是for
循环语法更合适的情况之一吗?我倾向于说,for
循环在这里更好,因为我依赖于数组的索引位置,当我遍历它以获得结果集。
private static ISet<int> CalcSumsOfTwoNums2(IEnumerable<int> nums)
{
// get List<int> from nums to get info about collection length
var source = nums.ToList();
// proper iteration
var data = source.Take(source.Count - 1)
.SelectMany((e, ix) => source.Skip(ix)
.Take(source.Count - 1 - ix)
.Select(i => new { e, i }))
.Select(x => x.e + x.i)
.Where(x => x < MAX);
// return HashSet instead of IEnumerable<int>
return new HashSet<int>(data);
}
它返回与你的方法相同的结果。但是,我将继续使用您当前的解决方案。
你可以试试下面的Linq:
var asArray = nums.ToArray();
var result = (from n1 in asArray.Take(asArray.Length - 2)
from n2 in asArray.Take(asArray.Length - 1)
where n1 + n2 <= MAX
select n1 + n2);
iset = new HashSet<int>(result);
它的输出与您的代码片段相同