如何优化此LINQ扩展方法

时间:2010-03-05 09:48:14

标签: c# linq lambda expression-trees

我写了一个自定义排序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 个答案:

答案 0 :(得分:3)

每个“let”子句都会增加一个额外的委托级别。你可以通过删除它们来改善一些事情。您也不需要匿名类型 - 或者很可能需要ToList()调用。此外,每次在ToOADate()上调用maxDate都没有意义。

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”条款,请注意清楚。