2016-05-17 26 views
0

我是C#的新手,試圖回答一些LINQ問題。我被困在第一個標記爲困難...C#LINQ Group作者:

問:什麼是最大的平均起飛延誤的10個原產地機場,包括這些延誤的價值? (提示:使用由基團)?

我有填充「FlightInfo」超過20000個對象列表名爲「航班」。在FlightInfo類的

屬性是: 串運營商,串地,串目的地,詮釋DepartureDelay,詮釋ArrivalDelay,INT取消,詮釋距離

我知道我應該通過FlightInfo.Origin對FlightInfo進行分組,而不是通過FlightInfo.DepartureDelay對這些分組進行平均並且比平均延遲時間最高的顯示10,但除了分組外,我完全停留在如何進一步處理上。

非常感謝您的幫助!


這裏是以前的問題之一,我能回答的例子:

問:飛行的加權到來延遲它的到來延遲分的距離。什麼是馬薩諸塞州波士頓最大加權抵達延誤的航班?

答:

var weighted = (from FlightInfo in Flights 
       where FlightInfo.Origin == "Boston MA" 
       orderby (FlightInfo.ArrivalDelay/FlightInfo.Distance) descending 
       select FlightInfo).Take(1); 
+1

爲回答問題邊注:'Take'返回的IEnumerable''如果你想'T'情況下,是的,我看到使用'First'或'FirstOrDefault' –

+0

,當我用'First'我可以在不使用'foreach'循環的情況下訪問屬性。謝謝,我之前無法理解爲什麼我不能'Console.WriteLine(weighted.Origin)'。 –

回答

0
var topTen = flights. 
      GroupBy(g => g.Origin). 
      Select(g => new { Origin = g.Key, AvgDelay = g.ToList().Average(d => d.DepartureDelay) }). 
      OrderByDescending(o => o.AvgDelay). 
      Take(10); 
+0

謝謝,這是對我的問題的完整解決方案。現在因爲我是新手,我仍然無法掌握語法,似乎我在向前邁進。我有很多東西要學...... –

+0

你們先按一個鍵組。 Linq創建一個字典,其中鍵是您分組的鍵,值是這些對象的列表(與SQL有點不同)。之後,我們爲每個這些組做一個選擇,在那裏我們創建一個具有Origin和AvgDelay屬性的新匿名對象。平均延遲是列表中該特定鍵的所有對象的平均值。之後,它很容易 - 按AvgDelay排序,並以前10名。 – Rob

+0

非常感謝。我理解邏輯,但不管我如何嘗試,我都無法將其他屬性添加到Select中。假設我也想顯示Carrier。 'Select(g => new {g => new, AvgDelay = g.ToList()。Average(d => d.DepartureDelay), Company = g.ToList() => p。運營商)???? ') –

0

你能做到這一點。

var top10 = Flights.GroupBy(g=>g.Origin) // groupby origin 
        .OrderByDescending(x=> x.Sum(f=> f.ArrivalDelay/f.Distance)) // Get the weighted delay for each fight and use for ordering. 
        .Select(x=>x.Key) //Airport or Origin (Modify with what you want) 
        .Take(10) 
        .ToList() ; 
0
var result = flights 
    .GroupBy(f => f.Origin) 
    .OrderByDescending(g => g.Average(f => f.DepartureDelay))   
    .Take(10) 
    .Select(g => new 
    { 
     AirportName = g.Key, 
     Flights = g.ToList() 
    }); 

最後.Select參數取決於你想要什麼。

+0

謝謝你的回答。它給出了正確的,但不完整的答案。由於我是新手,我無法自己添加其他房產(出發延誤)。 –