2014-11-21 92 views
-4

我有一个List<Order>C#得到最小值,最大值和平均值从列表<object>

public class Order 
{ 
    public Order() 
    { 
    } 

    public string UserId {get; set;} 
} 

我希望能够用得到以下信息LINQ:

  • 具有最大订单UserId
  • UserId即最小订单
  • 所有订单的平均值

所以结果应该是这样的:

  • 用户ID:1具有20项目(最大)
  • 用户ID:2具有5个数量级(分)
  • 平均12.5订单
+2

最小值,最大值和平均值是什么?你有唯一的数据是一个字符串,你不能平均字符串。 (LINQ有很多很棒的教程:你学习LINQ的过程是什么?[SO]不是教程。) – Richard 2014-11-21 08:41:24

+1

订单的最小值,最大值和平均值... – 2014-11-21 08:42:39

+0

对,但是'Order'你会喜欢Max,Min和Average吗?你已经尝试了什么?为什么它不适合你?如上所述,Stack Overflow不是教程网站。 – Vincent 2014-11-21 08:44:24

回答

1

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

但是,我不清楚你如何获得单个用户的平均订单数量,是不是绝对值?

+0

请注意,OP可能想要中位数而不是平均值;找到'平均ID'毫无意义。 – Bas 2014-11-21 08:46:00

+0

@Bas:我一直在问自己同样的问题,并补充说,作为评论我的答案。因此,将问题的平均部分视为开放。无论如何,答案是有帮助的。 – 2014-11-21 08:48:31

1

通过userId创建组并与他们一起工作。

var groups = allOrders.GroupBy(o => o.UserId); 
int userWithMostOrders = groups.OrderByDescending(g => g.Count()).First().Key; 
double averageOrders = allOrders.Count()/groups.Count(); 
1
var userWithLeastOrders = ordens.GroupBy(o => o.UserId) 
           .OrderBy(group => group.Count()) 
           .First() 
           .Key; 

你应该能够制定出别人。

+0

但是,如果多个用户具有相同的订单数呢?此外,'Max'返回一个没有'Key'属性的int。 – 2014-11-21 08:50:21

+0

@TimSchmelter确实,我已经解决了我的答案,谢谢。至于在多个用户具有相同的订单数量时应该发生什么,OP没有告诉我们会发生什么,所以假定他想要这些用户中的任何一个*是公平的。 – dcastro 2014-11-21 09:22:15

相关问题