代码之家  ›  专栏  ›  技术社区  ›  Chris home

迭代元组中的项

  •  5
  • Chris home  · 技术社区  · 7 年前

    我有三个循环的方法:

        public void Print(Tuple<List<DateTime>, List<double>, List<string>> dataToPrint)
        {
            foreach (var item in dataToPrint.Item1)
            {
                Console.WriteLine(item);
            }
            foreach (var item in dataToPrint.Item2)
            {
                Console.WriteLine(item);
            }
            foreach (var item in dataToPrint.Item3)
            {
                Console.WriteLine(item);
            }
        }
    

    是否可以只使用一个循环来打印屏幕上包含列表内容的所有项目?

    4 回复  |  直到 7 年前
        1
  •  7
  •   Sergey Berezovskiy    7 年前

    当然,您可以将所有列表合并为一个序列 object string 项,但这种连接不会使代码更具可读性。但您可以创建简单的扩展方法,将任何序列的内容转储到控制台:

    public static void Dump<T>(this IEnumerable<T> source)
    {
        foreach(var item in source)
           Console.WriteLine(item);
    }
    

    您的代码看起来像(根本没有循环):

    public void Print(Tuple<List<DateTime>, List<double>, List<string>> dataToPrint)
    {
        dataToPrint.Item1.Dump();
        dataToPrint.Item2.Dump();
        dataToPrint.Item3.Dump();
    }
    

        2
  •  1
  •   Jerodev    7 年前

    是的,但你必须确保所有列表的长度都相同。
    你基本上可以这样做:

    for (var i = 0; i < dataToPrint.Item1.Length; i++)
    {
        Console.WriteLine(dataToPrint.Item1[i]);
        Console.WriteLine(dataToPrint.Item2[i]);
        Console.WriteLine(dataToPrint.Item3[i]);
    }
    
        3
  •  1
  •   Dave    7 年前

    编辑:在日期时间列表上调用ForEach(Console.WriteLine)实际上不会作为控制台工作。WriteLine没有一个特定的覆盖,它只使用一个对象的覆盖。自列表。ForEach需要一个操作和控制台。编写datetime所需的WriteLine方法实际上是此代码不会编译的操作,因此这个答案不正确。不过,我觉得很有趣,看看为什么它不起作用,所以我把它留在这里

    我真的不知道你为什么对那里的代码有问题。如果这是该方法的签名,并且你不能更改它,那么在我看来这是有效的。如果你出于某种原因真的想限制你的代码行,你可以这样做

    dataToPrint.Item1.ForEach(Console.WriteLine);
    dataToPrint.Item2.ForEach(Console.WriteLine);
    dataToPrint.Item3.ForEach(Console.WriteLine);
    

    其他一些人建议所有列表的for循环长度相同,但打印顺序与您描述的不同。并将所有列表中的所有项转换为对象,这样您可以继续使用列表,由于将您的值类型装箱为double,因此成本可能会很高。 编辑:我被告知,与写入控制台的性能相比,装箱可能微不足道。然而,我仍然认为将它们全部转换为object并不是最好的选择,但那只是我自己

        4
  •  0
  •   Tom Söhne    7 年前

    试试这个:

    foreach (var element in dataToPrint.Item1.Cast<object>().Concat(dataToPrint.Item2.Cast<object>()).Concat(dataToPrint.Item3.Cast<object>()))
    {
        Console.WriteLine(element);
    }