2010-03-05 3 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(). Кроме того, нет смысла звонить 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)); 
} 

Это замечание, которое ясно, без предложений «пусть», заметьте.

+1

«Каждая статья« let »добавляет дополнительный уровень делегирования»: не могли бы вы рассказать об этом? Я думал, что это создаст только один анонимный тип с p, score, date1 и date2 –

+0

Чтобы сделать заказ «Descending», следует ли использовать OrderByAncesty (..). Reverse()? –

+1

Используйте вместо OrderByDescending –

Смежные вопросы