我有三个循环的方法:
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);
}
}
是否可以只使用一个循环来打印屏幕上列出内容的所有项目?
答案 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);
}