如何Console.Writeline IEnumerable <(int a,int b,int c)>?

时间:2018-12-01 02:52:53

标签: c#

我正在通过一些计算机科学练习,很尴尬地说我不知道​​如何在VS Studio中控制台打印上述代码。我已经尝试了好几天,而部分问题是我实际上不知道上述结构的名称(比喻说)。我已经完成了作业,阅读了手册,但是现在除了举手问问题外别无他法。在线上似乎有许多使用IEnumerable<int>的示例,但是没有输出我能找到的元组。任何示例代码张贴将不胜感激。

public static class PythagoreanTriplet
{
    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);

    }
}


public static class testclass
{
    public static void Main()
    {
        int input = 121;
        var data = PythagoreanTriplet.TripletsWithSum(input);
        Console.WriteLine(data);
    }
}


输出:

System.Collections.Generic.List`1[System.ValueTuple`3[System.Int32,System.Int32,System.Int32]]

1 个答案:

答案 0 :(得分:6)

您必须将元组分解成这样的部分:

public static void Main()
{
    int input = 121;
    var data = PythagoreanTriplet.TripletsWithSum(input);
    foreach(var d in data)
        Console.WriteLine($"{d.a} {d.b} {d.c}");
}

原因是Tuple类没有覆盖ToString函数,因此输出类的名称,而不是组成Tuple的部分。您将需要为您的解决方案提供一种将自定义元组转换为字符串以供使用的方法。

另一种选择是创建一个类型,该类型表示要投影到并以TripletsWithSum返回的数据,这样可以根据需要覆盖ToString函数

public class Tuple3Int : Tuple<int, int, int> 
{
    public Tuple3Int(int a, int b, int c) : base(a, b, c) { }

    public override string ToString()
    {
        return $"{Item1} {Item2} {Item3}";
    }
}

public static IEnumerable<Tuple3Int> TripletsWithSum(int sum)
{
    return Enumerable.Range(1, sum - 1)
                     .SelectMany(a => Enumerable.Range(a + 1, sum - a - 1)
                                                .Select(b => new Tuple3Int(a, b, sum - a - b)))
                     .Where(x => x.Item1 * x.Item1 + x.Item2 * x.Item2 == x.Item3 * x.Item3);

}