我已经相当详尽地阅读了.NET文档,但是还没有了解如何使用IEnumerable
方法输出三重整数列表或元组,而不是仅输出单个整数。我了解IEnumerable
在C#中的作用,但不了解将答案转换为IEnumerable
类型并清除以下错误所需的操作。实际上,我不确定该函数(通过编码分配)作为输出类型需要什么,因为大多数在线文档和参考文献似乎只关注单个整数输出。
error CS0029: Cannot implicitly convert type '(int a, int b, int c)' to 'System.Collections.Generic.IEnumerable<(int a, int b, int c)>'
public static IEnumerable<(int a, int b, int c)> TripletsWithSum(int sum)
{
for (int a = 1; a < sum; a++)
{
for (int b = a +1; b < sum; b++)
{
int c = sum - a - b;
if ( a * a + b * b == c * c)
{
var final = (a,b,c);
return final;
}
}
}
return null;
}
答案 0 :(得分:2)
您应将return final;
更改为yield return final;
然后您的函数将按需生成一个三元组(例如,在foreach
循环中,每次迭代将生成一个三元组)。
这称为惰性评估。您的函数不返回集合,而是有关如何获取下一个元素的“配方”。您的函数执行将被暂停,直到需要下一个元素,依此类推。
请注意,您可以在函数中使用return
或yield return
。 两者都不。因此,您已经摆脱了return null
。
在转换现有的return
时应使用IEnumerable
(例如return Enumberable.Range(1,3).Select(number => number.ToString())
。如果从头开始构建IEnumerable
,则应使用yield return
; < / p>
答案 1 :(得分:1)
不确定代码的用途,但是您需要使用yield
关键字,并且不需要在null
循环之后返回for
:
public static IEnumerable<(int a, int b, int c)> TripletsWithSum(int sum)
{
for (int a = 1; a < sum; a++)
{
for (int b = a +1; b < sum; b++)
{
int c = sum - a - b;
if ( a * a + b * b == c * c)
{
var final = (a,b,c);
yield return final;
}
}
}
}
答案 2 :(得分:1)
不涉及产量的替代解决方案:
public static IEnumerable<(int a, int b, int c)> TripletsWithSum(int sum)
{
return Enumerable.Range(1, sum - 1)
.SelectMany(a => Enumerable.Range(a + 1, sum - a - 1)
.Select(b => (a: a, b: b, c: sum - a - b)))
.Where(x => x.a * x.a + x.b * x.b == x.c * x.c);
}