2010-08-18 6 views

Répondre

2

Ce n'est pas testé mais je pense que quelque chose comme cela devrait fonctionner:

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

Il devrait être OrderByDescending, pas OrderBy (ou retournera la ligne avec la valeur min de RADI) –

+1

@Thomas - Merci d'avoir signalé cela - une légère faute de frappe de ma part. J'ai modifié ma réponse. – codingbadger

6

Bien que la solution affichée par Barry devrait travailler (avec quelques corrections), il est sous-optimale: vous n'avez pas besoin trier une collection pour trouver l'élément avec la valeur maximale d'un champ. J'ai écrit une méthode d'extension WithMax, qui renvoie l'élément avec la valeur maximale de la fonction spécifiée:

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

Elle parcourt la collection une seule fois, ce qui est beaucoup plus rapide que le tri juste pour obtenir le premier élément.

Vous pouvez alors l'utiliser comme suit

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

cela fonctionne avec une requête!

public static T WithMax<T, TValue>(this IEnumerable<T> source, Func<T, TValue> keySelector) 
{ 
    return source.OrderByDescending(keySelector).FirstOrDefault(); 
} 
Questions connexes