私は最近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 や電子ブックを学習するのに適したサイトはありますか?