Cela nécessiterait une sorte (O(n journal n)) mais est très simple et flexible. Un autre avantage est de pouvoir l'utiliser avec LINQ to SQL :
var maxObject = list.OrderByDescending(item => item.Height).First();
Notez que cette méthode présente l'avantage d'énumérer les éléments suivants list
séquence juste une fois. Même si cela n'a pas d'importance si list
es un List<T>
que cela ne change pas entre-temps, cela pourrait avoir de l'importance pour l'arbitraire. IEnumerable<T>
objets. Rien ne garantit que la séquence ne change pas dans les différentes énumérations, donc les méthodes qui le font plusieurs fois peuvent être dangereuses (et inefficaces, selon la nature de la séquence). Cependant, c'est toujours une solution moins qu'idéale pour les grandes séquences. Je suggère d'écrire votre propre MaxObject
extension manuelle si vous avez un grand ensemble d'éléments pour pouvoir le faire en une seule passe sans tri et autres trucs du genre (O(n)) :
static class EnumerableExtensions {
public static T MaxObject<T,U>(this IEnumerable<T> source, Func<T,U> selector)
where U : IComparable<U> {
if (source == null) throw new ArgumentNullException("source");
bool first = true;
T maxObj = default(T);
U maxKey = default(U);
foreach (var item in source) {
if (first) {
maxObj = item;
maxKey = selector(maxObj);
first = false;
} else {
U currentKey = selector(item);
if (currentKey.CompareTo(maxKey) > 0) {
maxKey = currentKey;
maxObj = item;
}
}
}
if (first) throw new InvalidOperationException("Sequence is empty.");
return maxObj;
}
}
et l'utiliser avec :
var maxObject = list.MaxObject(item => item.Height);
7 votes
Var maxDimension = dimensions.OrderByDesc(x=>x.Height).FirstOrDefault() ;
0 votes
Quelle fonction simple et utile. Une fonction MaxBy devrait faire partie de la bibliothèque standard. Nous devrions faire une demande de fonctionnalité à Microsoft github.com/dotnet/corefx