【发布时间】:2013-08-29 22:37:03
【问题描述】:
我在列表中有一个列表。 正如您从我的 foreach 示例中看到的那样,我首先通过航班,然后通过 SEGMENTS,我在 1 行中打印 1 个航班的所有航段,然后我将 NewLine 用于新航班,它可以由 1 个航段或更多航段组成. 1段由出发时间和到达时间组成。
当我使用 foreach 时,我可以在每个段完成后换行,如下所示:
foreach (var flight in f)
{
foreach (var flight1 in flight.Segments.Where(x=>x.DepartureDate > DateTime.Now))
{
Console.Write(
"Departure: {0}, Arrival: {1}; ",
flight1.DepartureDate,
flight1.ArrivalDate);
}
Console.WriteLine(Environment.NewLine);
}
结果:
出发:2.9.2013 12:23:05,到达:2.9.2013 2:23:05;
出发:2.9.2013 12:23:05,到达:2.9.2013 2:23:05;离开: 2.9.2013 3:2 3:05,到达:2.9.2013 5:23:05;
这很好用。我现在很感兴趣我怎么能用 Linq 做这个?我有 Linq 的结果,但所有结果都在一行中,不知道在哪里放置“NewLine”以将每个航段放入新行而不是一行中的所有航段......如果我使用 Environment.NewLine,它会将每个段放在新行中。但是 1 个航班的航段应该在 1 行中。
我使用这种 Linq 方法:
public IEnumerable<Segment> GetActiveFlights(IEnumerable<Flight> flights)
{
var query = from flight in flights
from segment in flight.Segments
where segment.DepartureDate > DateTime.Now
select new Segment()
{
DepartureDate = segment.DepartureDate,
ArrivalDate = segment.ArrivalDate
};
return query;
}
然后我用它来迭代:
IEnumerable<Flight> f = flightList.GetFlights();
foreach (var flight in flightFilter.GetActiveFlights(f))
{
Console.Write(
"Departure: {0}, Arrival: {1}; ",
flight.DepartureDate,
flight.ArrivalDate);
}
结果:
出发:2.9.2013 12:23:05,到达:2.9.2013 2:23:05;出发时间:2.9.2013 12: 23:05,到达:2.9.2013 2:23:05;出发时间:2.9.2013 3:23:05, 到达时间:2.9.2013 5:23:05;出发:2.9.2013 12:23:05,到达: 1.9.2013 6:23:05;出发:2。 9.2013 12:23:05,到货:2.9.2013 2:23:05;出发:2.9.2013 5:23:05,到达
但是在这里我所有的结果都在一行中。我怎样才能使每个航班(由多个航段或 1 个航段组成)都写在新行中。
【问题讨论】:
-
使用默认换行的console.writeline怎么样?
-
这会使每个航段都变成新行,这不是我需要的,因为某些航班可以由多个“航段”组成(例如,如果它不是直飞目的地的航班,如果你必须移动到其他飞机...例如,您从威尼斯飞往费城,而不是从费城飞往旧金山。从 foreach 示例中可以看出,我需要在 1 行中进行整个飞行(由分段构建)。
-
使用 LINQ 只会变得更奇怪。您必须在迭代元素时执行一些操作,LINQ 非常适合查询。我认为在这种情况下,您的嵌套 foreach 实现非常好。
-
我只是觉得如果你使用 linq 或 lambda 表达式而不是双 foreach 会更好的实践和更好的可读性。
-
在将
f和flight1变量重命名为更直观的名称后,这段代码对我来说似乎足够可读。另外,在性能方面,我认为你不能做得比这更好。