2016-05-17 9 views
0

Ich bin neu in C# und versuchen, einige LINQ Fragen zu beantworten. Ich stecke auf 1. markiert als schwierig ...C# LINQ Group von

F: Was waren die Top 10 Herkunft Flughäfen mit den größten durchschnittlichen Abflugverzögerungen, einschließlich der Werte dieser Verzögerungen? (Tipp: Gruppe verwenden nach)

Ich habe eine Liste dem Namen „Flights“ bevölkert mit mehr als 20000 Objekte der Klasse „FlightInfo“.

Eigenschaften der FlightInfo Klasse sind: String Träger, string Herkunft, string Ziel, int DepartureDelay, int ArrivalDelay, int Abgebrochen, int Entfernung.

Ich verstehe, dass ich FlightInfo von FlightInfo.Origin gruppieren sollte und dann jede dieser Gruppen durch FlightInfo.DepartureDelay und als 10 mit der höchsten durchschnittlichen Verzögerung zeigen, aber neben der Gruppierung bin ich völlig fest, wie weiter zu verfahren.

Vielen Dank im Voraus für jede Hilfe! Hier


ist das Beispiel eines der vorherigen Fragen, die ich war in der Lage zu antworten:

Q: Die gewichtete Ankunft Verspätung eines Fluges ist seine Ankunft Verzögerung den Abstand geteilt. Was war der Flug mit der größten gewichteten Ankunftszeit außerhalb von Boston, Massachusetts?

A:

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

Randnotiz für die beantworteten Frage: 'Take' kehrt der' IEnumerable ', wenn Sie' T' Beispiel möchten, verwenden Sie 'First' oder' FirstOrDefault' –

+0

Ja, ich sehe, dass, wenn ich 'First' verwenden Ich kann zu den Eigenschaften gelangen, ohne 'foreach' zu verwenden. Danke, ich konnte vorher nicht verstehen warum ich 'Console.WriteLine (Weighted.Origin)' nicht kann. –

Antwort

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

Danke, das ist die komplette Lösung für meine Frage. Jetzt, da ich ein Neuling bin, kann ich die Syntax immer noch nicht verstehen, es scheint, als würde ich vorauseilen. Ich habe so viel zu lernen ... –

+0

Zuerst von dir Gruppe mit einem Schlüssel. Linq erstellt ein Dictionary, in dem key der Schlüssel ist, nach dem Sie gruppiert wurden, und der Wert ist die Liste dieser Objekte (etwas anders als SQL). Danach machen wir eine Auswahl für jede dieser Gruppen, wo wir ein neues anonymes Objekt mit den Eigenschaften Origin und AvgDelay erstellen. Die durchschnittliche Verzögerung ist der Durchschnitt aller Objekte in der Liste für diesen bestimmten Schlüssel. Danach ist es einfach - bestellen Sie bei AvgDelay und nehmen Sie die ersten 10. – Rob

+0

Vielen Dank. Ich verstehe die Logik, aber egal wie ich es versuche, ich kann Select keine andere Eigenschaft hinzufügen. Sagen wir, ich würde Carrier auch gerne zeigen. 'Wählen Sie (g => neu { Ursprung = g.Key, AvgDelay = g.ToList(). Durchschnitt (d => d.DepartDelay), Firma = g.ToList(). ???? (p => p.Träger)???? }) ' –

0

Sie könnten dies tun.

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() 
    }); 

Die letzten .Select Parameter hängen davon ab, was Sie wollen.

+0

Vielen Dank für Ihre Antwort. Es gibt korrekte, aber unvollständige Antwort. Da ich Neuling bin, konnte ich keine andere Eigenschaft selbst hinzufügen (Abfahrtszeit). –