C# 从 list
本文关键字:最小值 最大值 平均值 获取 list object | 更新日期: 2023-09-27 18:31:16
>我有一个List<Order>
public class Order
{
public Order()
{
}
public string UserId {get; set;}
}
我希望能够使用 LINQ 获取以下信息:
- 订单最多的
UserId
- 订单最少的
UserId
- 所有订单的平均值
所以结果应该是这样的:
- 用户 ID:1 有 20 个订单(最多)
- 用户 ID:2 有 5 个订单(分钟)
- 平均 12.5 订单
您可以使用Lookup
:
var userLookup = orderList.ToLookup(o => o.UserId);
int maxOrders = userLookup.Max(x => x.Count());
int minOrders = userLookup.Min(x => x.Count());
int avgOrders = (int)userLookup.Average(x => x.Count());
IEnumerable<string> allUserIDsWithMaxOrders = userLookup
.Where(x => x.Count() == maxOrders)
.Select(g => g.Key);
IEnumerable<string> allUserIDsWithMinOrders = userLookup
.Where(x => x.Count() == minOrders)
.Select(g => g.Key);
IEnumerable<string> allUserIDsWithAvgOrders = userLookup
.Where(x => x.Count() == avgOrders)
.Select(g => g.Key);
但是,我不清楚您希望如何获得单个用户的平均订单数,这并不总是绝对值吗?
按 userId 创建组并处理它们。
var groups = allOrders.GroupBy(o => o.UserId);
int userWithMostOrders = groups.OrderByDescending(g => g.Count()).First().Key;
double averageOrders = allOrders.Count() / groups.Count();
var userWithLeastOrders = ordens.GroupBy(o => o.UserId)
.OrderBy(group => group.Count())
.First()
.Key;
你应该能够解决其他人的问题。