2012-03-15 10 views
3

嗨,我試圖讓我的腦袋圍繞分組,然後在結果中構建自己的類。我知道一個組的結果是一個IGrouping集合,但是我可以在構建它們時訪問這些行,以便使用一個自定義類爲它們添加一些標誌?如何分組然後選擇LINQ中的新類的元素(最好是C#)

我有一個類FlightTimes與一些數據,但我想追加一些數據的行,如FlagRedEye。所以我創建了一個名爲FlightTimeResult的類,其中包含原始的FlightTime類數據和標誌。

我可以這樣做嗎?我似乎無法弄清楚如何讓它起作用。我喜歡使用強類型,直到我明白髮生了什麼。爲了保護我的客戶,我不得不改變一些東西,所以我對任何語法錯誤表示歉意。

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 + extra flag)進行分組。不知道如何訪問查詢中的單個FlightTime行'選擇新的FlightTimeResult()'

我是否需要對groupedFlights使用嵌套查詢?

非常感謝。

+0

您想訪問哪個'FlightTime'? – SLaks 2012-03-15 22:14:45

+0

我重新使用FlightTimes兩次抱歉。改變變量的名字會讓我知道。我只是想獲得原始的FlightTime列表,但爲其中的每個元素添加一個標誌。試圖在頁面代碼中多次停止操作。然後,按FlightType組合。 – Bryce 2012-03-15 22:56:07

回答

4

這是最簡單的調用LINQ的功能明確以下方式實現的:

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有兩個lambda表達式作爲參數 - 一個用於提取鍵,第二個爲它提取值。

而且記住,組由操作(無論是group itm by key建設或GroupBy調用)返回IGrouping<,>個集合 - 沒有一個。

因此它將是IEnumerable<IGrouping<,>>IQueryable<IGrouping<,>>

+0

不錯。我也會嘗試。非常感謝你。就速度而言,方法類型的查詢速度更快?我需要每一毫秒。 – Bryce 2012-03-15 22:44:40

+0

@Bryce,但這可能是因爲省略了'select'。事實上,方法類型('.OrderBy')和構造類型('order ... by .. into')的調用是等價的。編譯器在編譯期間只需將後者轉換爲前者。 – Krizz 2012-03-15 22:49:13

+0

我想知道轉換成本如何。如果我只使用方法類型,我會獲得任何顯着/可測量的性能?我的意思是無處不在,不僅僅是這個問題。 – Bryce 2012-03-15 22:54:33

1

我認爲你是在正確的軌道上。請不要按FlightType對FlightTimes進行分組,而是嘗試構建FlightTimeResults並將其按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; 
相關問題