2012-03-15 8 views
3

こんにちは私はグループ化の周りに頭を浮かべて、結果に自分のクラスを構築しようとしています。私はグループの結果をIGroupingコレクションだと知っていますが、カスタムクラスを使用していくつかのフラグを追加するために行をアクセスすることはできますか?グループ化してLINQの新しいクラスに要素を選択する方法(C#の方が望ましい)

FlightTimesという名前のクラスがありますが、FlagRedEyeのようにデータに行を追加したいと思います。そこでFlightTimeクラスのデータにフラグを加えたFlightTimeResultというクラスを作成しました。

私はこれを行うことができますか?私はそれを働かせる方法を理解できないようです。私は何が起こっているのか理解するまで、強いタイプを使用するのが好きです。私はクライアントを保護するためにいくつかの変更を加えなければならなかったので、構文エラーについてはお詫びします。

IGrouping<string, FlightTimeResult> FlightTimes = 
       (from flighttimes in schedules.FlightTimes 
       group flighttimes by flighttimes.FlightType.ToString() 
        into groupedFlights 
       select new FlightTimeResult() 
       { 
        FlightTimeData = FlightTime, // Original class data 
        FlagRedEye = (FlightTime.departureTime.Hour >= 0 && 
            FlightTime.departureTime.Hour < 6) // Extra flag 
       }) 

目標はFlightTypeによってグループ化されたFlightTimesResult(FlightTime +余分なフラグ)のコレクションを持つことです。 'FlightTimeResult()'を選択してクエリ内の個々のFlightTime行にアクセスする方法がわからない

groupedFlightsでネストされたクエリを使用する必要がありますか?

ありがとうございました。これは、最も簡単な方法は、以下に明示的にLINQの関数を呼び出すことによって達成される

+0

どのFlightTimeにアクセスしますか? – SLaks

+0

FlightTimesを2回再利用しました。変数の名前を変更すると、私はそれを知っているだろう。私は元のFlightTimeリストを取得したいが、その中の各要素にフラグを追加したい。ページコードに何度も操作を続行しようとしています。その後、FlightTypeでグループ化します。 – Bryce

答えて

4

IQueryable<IGrouping<string, FlightTimeResult>> query 
     = schedules.FlightTimes.GroupBy(
       ft => ft.FlightType.ToString(), // key 
       ft => new FlightTimeResult() { // your constructed objects for key 
        FlightTimeData = ft, 
        FlagRedEye = (ft.departureTime.Hour >= 0 && ft.departureTime.Hour < 6) 
        } 
       ); 

two-argument GroupBy operator functionは、引数として2つのラムダを取る - 抽出キーの1、それに対する値を抽出する第2。ない単一のもの - 。

また操作によってグループは、(それがgroup itm by key建設またはGroupBy呼び出し可能)IGrouping<,>のコレクションを返すことに注意してください

したがって、IEnumerable<IGrouping<,>>またはIQueryable<IGrouping<,>>になります。

+0

ニース。私もそれを試みます。どうもありがとうございました。速度に関しては、クエリのメソッド型がより高速ですか?私はミリ秒ごとに必要です。 – Bryce

+0

@Bryceしかしこれは 'select'を省略したためかもしれません。実際、メソッド型( '.OrderBy')と構築型(' 'order ... by..'')の呼び出しは同等です。コンパイラはコンパイル時に後者を単純に前者に変換します。 – Krizz

+0

変換にはどれくらいの費用がかかりますか?私がMethod-typeを使うだけであれば、有意義な測定可能なパフォーマンスが得られますか?この問題だけでなく、あらゆるところを意味します。 – Bryce

1

あなたは正しい方向にいると思います。 FlightTypeをFlightTypeでグループ化する代わりに、FlightTypeResultsを作成してFlightTypeでグループ化してみてください:

var results = 
    from ft in schedules.FlightTimes 
    group new FlightTimeResult 
     { 
      FlightTimeData = ft, 
      FlagRedeye = ft.DepartureTime.Hour >= 0 && ft.DepartureTime.Hour < 6 
     } 
    by ft.FlightType.ToString() 
    into groupedFlights 
    select groupedFlights; 
関連する問題