2016-05-17 21 views
0

私はC#を初めて使用し、いくつかのLINQ質問に答えることを試みています。私は難しいとマークされた1番で立ち往生しています...C#LINQグループby

Q:これらの遅延の値を含む、平均出発便の遅延が最も大きい10の出発空港は何ですか? (ヒント:by group by)

私はクラス「FlightInfo」以上の20000個のオブジェクトが移入リストという名前の「フライト」を持っています。 FlightInfoクラスの

プロパティは以下のとおりです。 文字列のキャリア、文字列の起源、文字列の先、int型DepartureDelay、int型ArrivalDelay、int型キャンセル、int型の距離

私は、FlightInfo.OriginでFlightInfoをグループ化し、FlightInfo.DepartureDelayでこれらのグループを平均し、平均遅延が最も高い10を表示することを理解していますが、グループ化のほかに、さらに進める方法に完全に固執しています。

ありがとうございました!飛行の加重到着遅延が到着遅延が距離を分けている:

Q:ここ


は私が答えることができた前回の質問の一つの例です。マサチューセッツ州ボストンから最大の加重到着遅延を持つフライトは何でしたか?

A:

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は辞書を作成します。ここでkeyはグループ化したキーであり、値はそれらのオブジェクトのリストです(SQLとは少し異なります)。その後、OriginとAvgDelayのプロパティを持つ新しい匿名オブジェクトを作成するグループごとにselectを実行します。平均遅延は、その特定のキーに対するリスト内のすべてのオブジェクトの平均です。その後は簡単です - AvgDelayで注文し、最初の10日をとります。 – Rob

+0

ありがとうございます。私は論理を理解していますが、どのように試しても、Selectに別のプロパティを追加することはできません。私もキャリアを見せたいとしましょう。 '(g => new { Origin = g.Key、 AvgDelay = g.ToList()。平均(d => d.DepartureDelay)、 会社= 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

ありがとうございます。それは正しいが、不完全な答えを与える。私は初心者なので、自分で別の不動産を追加することはできませんでした(出発遅延)。 –