2010-08-18 132 views

回答

2

這是未經測試,但我認爲這樣的事情應該工作:

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

應該OrderByDescending,不排序依據(或將返回該行與拉迪的最小值) – 2010-08-18 22:20:35

+1

@Thomas - 感謝您指出了這一點 - 輕微錯字我的一部分。我已經修改了我的答案。 – codingbadger 2010-08-19 06:27:51

6

雖然張貼巴里的解決方案應該工作(有一些修復),這是次優的:你不需要對集合進行排序以查找具有最大字段值的項目。我寫了一個WithMax擴展方法,它與指定的函數的最大值返回該項:

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; 
    } 

它遍歷集合只有一次,這是比排序只是爲了得到第一個項目快得多。

然後,您可以使用它,如下所示

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(); 
}