0

我在列表中有一个列表。正如您从我的 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 个航段组成)都写在新行中。

4

2 回答 2

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

我个人更喜欢有一个wraps的Joined扩展方法(采用分隔符和一个可选的转换委托),以及一个wraps的扩展方法:IEnumerable<T>String.JoinFormattedStringString.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);
于 2013-08-29T23:21:46.583 回答
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);
于 2013-08-29T23:25:02.117 回答