我在List中有一个List。 从我的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组成)用新行写成。
答案 0 :(得分:3)
Console.Write(
String.Join(Environment.NewLine, f.Select(flight => {
var segments = flight.Segments.Where(x => x.DepartureDate > DateTime.Now);
return String.Join(" ", segments.Select(segment => {
return String.Format("Departure: {0}, Arrival: {1};", segment.DepartureDate, segment.ArrivalDate));
});
});
);
我个人更喜欢在Joined
上使用IEnumerable<T>
扩展方法,其中包含String.Join
(使用分隔符和可选的转换委托)以及Formatted
扩展方法包裹String
的{{1}}:
String.Format
答案 1 :(得分:0)
var query = flights.SelectMany(f=>
new []{ string.Join("", f.Segments
.Where(s=>s.DepartureDate > DateTime.Now)
.Select(s=>
string.Format("Departure: {0}, Arrival: {1}; ", s.DepartureDate, s.ArrivalDate))), Environment.NewLine});
foreach(var e in query)
Console.Write(e);