【问题标题】:List within a List - How to put new line with LinQ after List within List is over?列表中的列表 - 列表中的列表结束后如何在 LinQ 中添加新行?
【发布时间】:2013-08-29 22:37:03
【问题描述】:

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

【问题讨论】:

  • 使用默认换行的console.writeline怎么样?
  • 这会使每个航段都变成新行,这不是我需要的,因为某些航班可以由多个“航段”组成(例如,如果它不是直飞目的地的航班,如果你必须移动到其他飞机...例如,您从威尼斯飞往费城,而不是从费城飞往旧金山。从 foreach 示例中可以看出,我需要在 1 行中进行整个飞行(由分段构建)。
  • 使用 LINQ 只会变得更奇怪。您必须在迭代元素时执行一些操作,LINQ 非常适合查询。我认为在这种情况下,您的嵌套 foreach 实现非常好。
  • 我只是觉得如果你使用 linq 或 lambda 表达式而不是双 foreach 会更好的实践和更好的可读性。
  • 在将fflight1 变量重命名为更直观的名称后,这段代码对我来说似乎足够可读。另外,在性能方面,我认为你不能做得比这更好。

标签: c# linq


【解决方案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&lt;T&gt; 上使用 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);

【讨论】:

    【解决方案2】:
    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);
    

    【讨论】:

      猜你喜欢
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2016-11-04
      • 1970-01-01
      相关资源
      最近更新 更多