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"));
Il devrait être OrderByDescending, pas OrderBy (ou retournera la ligne avec la valeur min de RADI) –
@Thomas - Merci d'avoir signalé cela - une légère faute de frappe de ma part. J'ai modifié ma réponse. – codingbadger