2010-03-05 4 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)); 
} 

"let"절이 없으면 분명합니다.

+1

"각"하자 "위임의 여분의 수준을 추가하자": 이걸 정교 할 수 있을까? 나는 p, score, date1, date2와 함께 하나의 익명 형식을 만들 것이라고 생각했습니다. –

+0

"내림차순"순서를 사용하려면 OrderByAncesty (..)를 사용해야합니까? Reverse()? –

+1

대신 OrderByDescending 사용 –