迭代元组中的项目

时间:2017-11-09 08:36:13

标签: c# loops tuples console-application

我有三个循环的方法:

    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 个答案:

答案 0 :(得分:7)

当然,您可以将所有列表连接成一个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(); } 项的序列,但这种连接不会使您的代码更具可读性。但是您可以创建简单的扩展方法,将任何序列的内容转储到控制台:

word

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

t

我还会使用命名参数,自定义类型或值元组将这三个值传递给方法。

答案 1 :(得分:1)

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

for (var i = 0; i < dataToPrint.Item1.Length; i++)
{
    Console.WriteLine(dataToPrint.Item1[i]);
    Console.WriteLine(dataToPrint.Item2[i]);
    Console.WriteLine(dataToPrint.Item3[i]);
}

答案 2 :(得分:1)

编辑:在日期时间列表上调用ForEach(Console.WriteLine)实际上不能用作Console.WriteLine没有特定的覆盖,该覆盖采用它只使用获取对象的覆盖的日期时间。由于List.ForEach期望一个Action和编写日期时间所需的Console.WriteLine方法实际上是一个Action,这段代码不会编译,所以这个答案是不正确的。但是我认为它很有意思,为什么它不会起作用,所以我将它留在这里

我不确定为什么你的代码有问题。如果这是方法的签名而你无法改变它那么对我来说似乎是有效的。如果您出于某种原因确实想限制行代码,可以执行此操作

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

其他一些人建议所有列表的for循环长度相同但这将以与您描述的顺序不同的顺序打印出来。并将所有列表中的所有项目转换为对象,因此您可以将列表设置为高成本,这要归功于将值类型设置为double。 编辑:我已经被告知,与写入控制台的性能相比,拳击可能是微不足道的。但是我仍然认为将它们全部投射到对象上并不是最好的选择,但那只是我

答案 3 :(得分:0)

试试这个:

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