如何创建要从IEnumerable接口输出的整数列表

时间:2018-11-17 18:40:39

标签: c#

我已经相当详尽地阅读了.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;
}

3 个答案:

答案 0 :(得分:2)

您应将return final;更改为yield return final;

然后您的函数将按需生成一个三元组(例如,在foreach循环中,每次迭代将生成一个三元组)。

这称为惰性评估。您的函数不返回集合,而是有关如何获取下一个元素的“配方”。您的函数执行将被暂停,直到需要下一个元素,依此类推。

请注意,您可以在函数中使用returnyield 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);
}