Sắp xếp là N * log (N)
trong khi Max có N
chỉ có thời gian phức tạp, vì vậy Max
là nhanh. Những gì bạn đang tìm kiếm là ArgMax
chức năng mà LINQ không cung cấp, vì vậy tôi đề nghị thực hiện nó, ví dụ:
public static class EnumerableExtensions {
public static T ArgMax<T, K>(this IEnumerable<T> source,
Func<T, K> map,
IComparer<K> comparer = null) {
if (Object.ReferenceEquals(null, source))
throw new ArgumentNullException("source");
else if (Object.ReferenceEquals(null, map))
throw new ArgumentNullException("map");
T result = default(T);
K maxKey = default(K);
Boolean first = true;
if (null == comparer)
comparer = Comparer<K>.Default;
foreach (var item in source) {
K key = map(item);
if (first || comparer.Compare(key, maxKey) > 0) {
first = false;
maxKey = key;
result = item;
}
}
if (!first)
return result;
else
throw new ArgumentException("Can't compute ArgMax on empty sequence.", "source");
}
}
Vì vậy, bạn có thể đặt nó chỉ đơn giản
var itemWithMaxPropValue = collection
.ArgMax(x => x.Property);
Nguồn
2016-02-17 16:28:07
tôi sẽ đi với ' Max' vì nó được thiết kế đặc biệt cho nó ...Sắp xếp để tìm giá trị tối đa có vẻ quá nhiều ... Ngoài ra, tôi sẽ không sử dụng 'Where' để tìm giá trị tối đa, nhưng' Single' – Ian
'OrderByDescending'/Quicksort phải là O (n^2) và' Max' là O (n) với 'Where' O (n) - vì vậy approch thứ hai nên nhanh hơn – fubo
xem https://www.nuget.org/packages/MoreLinq.Source.MoreEnumerable.MaxBy/ để sử dụng trong bộ nhớ (doesn 't dịch sang sql) –