这些天我正在学习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; }
}
每个航班由一个或多个航段组成。一个航段的航班是这样的:威尼斯 - 费城。有两个航段的航班是威尼斯 - 费城,费城 - 旧金山。也可以有 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或电子书的好网站?