2010-03-05 80 views
0

我寫了一個自定義的LINQ擴展方法,如下所示,但我認爲它可以針對較大的結果進行優化。如何優化此LINQ擴展方法

下面是代碼:

public static IEnumerable<T> OrderByAncesty<T>(this IEnumerable<T> source, Func<T, DateTime> dateSelector, Func<T, float> scoreSelector) 
    { 
     var original = source.ToList(); 
     var maxDate = source.Max(dateSelector); 
     var list = from p in original 
        let date = dateSelector(p) 
        let score = scoreSelector(p) 
        let date1 = date.ToOADate() 
        let date2 = maxDate.ToOADate() 
        let ancesty = (1 - (float)date1/(float)date2) * score 
        select new 
        { 
         TObject = p, 
         Ancesty = ancesty 
        }; 
     return list.OrderBy(p => p.Ancesty).Select(p => p.TObject); 
    } 
+1

爲什麼你使用表達式而不是'Func '? –

+0

是的,我不知道..我認爲它不是與Func ,我要更新我的問題 –

回答

3

每一個「讓」條款增加了代表團的一個額外水平。你可以通過刪除它們來改善某些事情。您也不需要匿名類型 - 或很可能是ToList()調用。此外,每次在maxDate上撥打ToOADate()毫無意義。

public static IEnumerable<T> OrderByAncesty<T>(this IEnumerable<T> source, 
    Func<T, DateTime> dateSelector, Func<T, float> scoreSelector) 
{ 
    var maxDate = (float) source.Max(dateSelector).ToOADate(); 
    return original.OrderBy(p => 
       (1 - (float)dateSelector(p).ToOADate()/maxDate)) 
       * scoreSelector(p)); 
} 

沒有「let」條款的話就說明清楚了,介意你。

+1

「每個」讓「條款增加了一個額外的代表團級別」:你能詳細說明這一點嗎?我認爲它會創建一個匿名類型的p,score,date1和date2 –

+0

爲了使「降序」順序,我應該使用OrderByAncesty(..)。Reverse()? –

+1

改爲使用OrderByDescending –