2010-03-05 79 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 –