我在List中有一个List。正如你从我的foreach示例中看到的那样,我首先浏览航班,然后浏览SEGMENTS,我将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.20132:23:05;
出发时间:2.9.2013 12:23:05,到达时间:2.9.20132:23:05;出发时间:2.9.2013 3:23:05,到达时间:2.9.2013 5:23:05;
这很好用。我现在很感兴趣,我怎么能和林克一起做这个?我有我和Linq的结果,但所有结果都在一行,不知道把"NewLine"放在哪里,把每个飞行段放在新的一行,而不是把所有段放在一行。。。如果我使用Environment.NewLine,它会将每个线段放在新行中。但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.20132: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,抵达时间:2013年9月19日6:23:05;出发时间:2。2013年9月12日23时05分,抵达时间:2013年9日2时23分05秒;出发时间:2.9.2013 5:23:05,抵达
但在这里,我所有的结果都在一行。我如何使每个飞行(由多个段或1个组成)都写在新行中。
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));
});
});
);
我个人更喜欢在IEnumerable<T>
上使用Joined
扩展方法来包装String.Join
(采用分隔符和可选的转换委托),在String
上使用Formatted
扩展方法来包裹String.Format
:
var output =
f.Joined(Environment.NewLine, flight =>
flight.Segments
.Where(s => s.DepartureDate > DateTime.Now)
.Joined(" ", s => "Departure: {0}, Arrival: {1};".Formatted(s.DepartureDate, s.ArrivalDate))
);
Console.Write(output);
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);