2014-11-21 134 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

相關問題