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 で結果を取得しましたが、すべての結果が 1 行に表示されます。すべてのセグメントを 1 行に表示するのではなく、各フライト セグメントを新しい行に配置するために「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 行に表示されます。各フライト (複数のセグメントまたは 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));
        });
    });
);

個人的には、(区切り文字とオプションの変換デリゲートを使用して) ラップする拡張メソッドと、ラップするJoined拡張メソッドを使用することを好みます。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 に答える