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 订单

C# 从 list<object> 中获取最小值、最大值和平均值

您可以使用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;

你应该能够解决其他人的问题。