2010-08-18 3 views

답변

2

이 안된하지만이 같은 일을해야 생각한다, 그것은 하위 최적 배리에 의해 게시 솔루션 (약간 수정에) 작동합니다

 var qry = from m in [YourDataSource] 
         group p by m.MOID into grp 
         select grp.OrderByDescending(a => a.RADI).First(); 
+1

그것은 OrderByDescending하지있는 OrderBy해야한다 (또는 RADI의 최소 값으로 행을 반환합니다) –

+1

@Thomas - 감사합니다 그 지적에 대해 - 약간의 오타 내 부분에. 나는 내 대답을 수정했다. – codingbadger

6

있지만 : 당신이 필요하지 않습니다 컬렉션을 정렬하여 필드의 최대 값을 가진 항목을 찾습니다.

public static T WithMax<T, TValue>(this IEnumerable<T> source, Func<T, TValue> selector) 
    { 
     var max = default(TValue); 
     var withMax = default(T); 
     bool first = true; 
     var comparer = Comparer<TValue>.Default; 
     foreach (var item in source) 
     { 
      var value = selector(item); 
      int compare = comparer.Compare(value, max); 

      if (compare > 0 || first) 
      { 
       max = value; 
       withMax = item; 
      } 
      first = false; 
     } 
     return withMax; 
    } 

그것은 한 번만 컬렉션을 반복 처리, 단지 첫 번째 항목을 얻을 수를 정렬하는 것보다 훨씬 빠르다 : 나는 지정된 함수의 최대 값으로 항목을 반환하는 WithMax 확장 방법을 썼다.

var query = 
    from row in table.AsEnumerable() 
    group row by row.Field<int>("MOID") into g 
    select g.WithMax(r => r.Field<int>("radi")); 
0

이 하나 개의 쿼리와 함께 작동을 다음과 같이

그런 다음 그것을 사용할 수 있습니다!

public static T WithMax<T, TValue>(this IEnumerable<T> source, Func<T, TValue> keySelector) 
{ 
    return source.OrderByDescending(keySelector).FirstOrDefault(); 
} 
관련 문제