Как оптимизировать этот метод расширения LINQ - PullRequest
0 голосов
/ 05 марта 2010

Я написал собственный метод расширения 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 Ответ

3 голосов
/ 05 марта 2010

Каждое предложение «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", заметьте.

...