列表内列表-列表内列表结束后,如何使用LinQ放置新行

本文关键字:列表 LinQ 新行 何使用 结束 | 更新日期: 2023-09-27 18:29:44

我在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个组成)都写在新行中。

列表内列表-列表内列表结束后,如何使用LinQ放置新行

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);