1

私は最近Linqを学んでいます。stackoverflow または Google でこの回答を探していましたが、必要なものが見つかりませんでした。

フライトクラス:

public class Flight
{
    public IList<Segment> Segments { get; set; }
}

これは私のセグメントクラスです:

public class Segment
{
    public DateTime DepartureDate { get; set; }
    public DateTime ArrivalDate { get; set; }
}

各フライトは、1 つ以上のセグメントで構成されます。1 セグメントのフライトは次のようになります。ベニス - フィラデルフィア。2 つのセグメントを持つフライトは、ベニス - フィラデルフィア、フィラデルフィア - サンフランシスコです。2 つ以上のセグメントが存在する場合もあります。

すべてのセグメントの到着と次の出発の時間差を計算するには、Segment2.DepartureDate と Segment1.ArrivalDate の間の時間を合計する必要があります。

foreach と次のような条件を使用して文字列用にこれを作成しました。

public string FilterFlights(IEnumerable<Flight> flights)
{
    string s = "";
    foreach (var flight in flights)
    {
    var indexItem = 0;
    DateTime previousArrivalDateTime = new DateTime();
    TimeSpan timeSpan;

    int time = 0;
    foreach (var segments in flight.Segments)
    {
        if (indexItem == 0)
        {
        previousArrivalDateTime = segments.ArrivalDate;
        s = s + "Departure: " + segments.DepartureDate + ", Arrival: " + segments.ArrivalDate + "; ";
        }

        if (indexItem > 0)
        {
        timeSpan = segments.DepartureDate - previousArrivalDateTime;
        time += timeSpan.Hours;
        s = s + "Departure: " + segments.DepartureDate + ", Arrival: " + segments.ArrivalDate + "; ";
        previousArrivalDateTime = segments.ArrivalDate;
        }
        indexItem++;
    }
    //d = 0;

    if (time > 2)
        Console.WriteLine(s);
    }

    return s;
}

私は実際に新しいメソッドを作成し、代わりに文字列を返したいIEnumerable<Flight>と思っています.LinQを使用するのが最善であることがわかりました。私はすでにElementAtメソッドを嗅ぎ回っていましたが、実際に何をしているのかわかりませんでした。

編集: これは、私のlinqメソッドで得た距離です:

public IEnumerable<Flight> FilterFlightsWithTwoHoursPlusGap(IEnumerable<Flight> flights)
{
    int totalGap = 0;

    return from flight in flights
       //wrong where syntax, don't know how to
    where flight.Segments.Select((y, index) =>
        totalGap +=
            (index == 0)
            ? totalGap = 0
            : (y.DepartureDate - flight.Segments.ElementAt(index - 1).ArrivalDate).Hours
        ).Where(totalGap < 2) // if gap is lower than 2 hours(calculated from timespans between departure current and arrival previous
    select flight; //return flights
}

だから、どんなアドバイスでもいいです。

PS: linq や電子ブックを学習するのに適したサイトはありますか?

4

1 に答える 1