我想在 enumerable 中獲取其屬性為最大值的所有元素:
IEnumerable<Person> allOldest = people.GroupBy(p => p.Age)
.OrderByDescending(i=>i.Key).First().Select(_=>_);
.NET 6 引入了MaxBy哪些回傳最大項:
Person uniqueOldest = people.MaxBy(person => person.Age);
MaxBy不能幫我?還有比第一個例子更優雅的解決方案嗎?
uj5u.com熱心網友回復:
使用Max是一種簡單明了的方法:
var maxAge = items.Max(y => y.Age);
var maxItems = items.Where(x => x.Age == maxAge);
uj5u.com熱心網友回復:
如果您可以向專案添加外部依賴項,則可以安裝可敬的MoreLinq包(最初由唯一的Jon Skeet 開發)并執行以下操作:
IEnumerable<Person> allOldest = MoreLinq.MoreEnumerable.MaxBy(people, p => p.Age);
MoreEnumerable.MaxBy方法簽名:
public static IExtremaEnumerable<TSource> MaxBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> selector);
您也可以嘗試將其用作擴展方法,方法是using在頂部添加此指令:
using static MoreLinq.Extensions.MaxByExtension;
...但在 .NET 6 中,這將導致(很可能)名稱決議沖突。
uj5u.com熱心網友回復:
這是 linq 不一定是最佳選擇的時代之一。您可以創建一個 linq 樣式擴展來執行此操作,但實際上最直接的解決方案只是撰寫一個函式。這是一個簡單的例子。我使用了一個值元組作為你的 person 物件的替代品。
static void Main(string[] _)
{
var source = new (int key, int value)[] { (0, 0), (1, 5), (2, 1), (3, 5), (4, 0), (5, 5) };
var allMax = new List<(int, int)>();
int currentMax = int.MinValue;
foreach (var (key, value) in source)
{
if (currentMax < value)
{
allMax.Clear();
allMax.Add((key, value));
currentMax = value;
}
else if (currentMax == value)
{
allMax.Add((key, value));
}
}
Console.WriteLine($"{allMax.Count} Max valued items found");
foreach (var (key, value) in allMax)
Console.WriteLine($"({key}, {value})");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/350731.html
