列表中的列表 - 列表中的列表结束后如何在LinQ中添加新行?

时间:2013-08-29 22:37:04

标签: c# linq

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

2 个答案:

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