2016-05-17 56 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

谢谢你的回答。它给出了正确的,但不完整的答案。由于我是新手,我无法自己添加其他房产(出发延误)。 –