2012-02-09 19 views
2

我有數據是這樣的:爲了通過與項目不同的對象

Id | Customer | CartTotal 
------------------------------- 
1 |  a  |  100 
2 |  a  |  50 
3 |  b  |  110 
4 |  b  |  128 

我需要CartTotal(降序)命令,並返回不同的客戶 所以,我應該在我的結果集有這樣的:

Id | Customer | CartTotal 
------------------------------- 
    4 |  b  |  128 
    1 |  a  |  100 

我相信我需要做一個訂單和預測。我正在使用強類型的IList<>數據源。我是LINQ新手..任何幫助將不勝感激。

+0

我不明白你用什麼標準爲'b'選擇CartTotal值爲128,爲'a'選擇CartTotal值爲100。每個定義了兩個單獨的值,應該使用哪個值? – 2012-02-09 01:24:37

+0

@KirkWoll如果我猜測,我會說'max' :) – dasblinkenlight 2012-02-09 01:27:55

+1

爲什麼選擇Ids 1和4而不是2和3?你在尋找最大CartTotal值的行嗎? – 2012-02-09 01:28:31

回答

4

類似下面應該做你以後:

var filteredPurchases = purchases.OrderByDescending(p => p.CartTotal) 
    .GroupBy(p => p.Customer) 
    .Select(g => g.First()); 

它會返回一個最大CartTotal購買每個Customer,獲得所需的結果。

1

這裏有一個查詢表達式版本:

var query = from cart in carts 
      orderby cart.CartTotal descending 
      group cart by cart.Customer into custCarts 
      select custCarts.First(); 
+0

感謝您分享查詢表達式語法@AndrewCooper – SR8 2012-02-09 01:57:53

2

答案爲止,而正確的,是顯著效率較低然後在需要的,因爲1)排序之前分組和2)只需要擺在首位的最大元素。首先排序使解決方案O(n*log(n))

照顧1號,我們可以做到以下幾點:

var query = purchases 
    .GroupBy(p => p.Customer) 
    .Select(g => g.OrderByDescending(p => p.CartTotal).First()); 

這會讓我們的解決方案類似O(n + n * log(n/c),其中C是客戶的數量。假設每個客戶的訂單大致不變,則爲O(n)

現在,我們可以做得更好,只需爲每個客戶找到最大元素並一次選擇它即可。不幸的是,Linq中的Max運算符使得它比應該更痛苦。如果你拉下MoreLinq,你可以做到以下幾點:

var query = purchases 
    .GroupBy(p => p.Customer) 
    .Select(g => g.MaxBy(p => p.CartTotal)); 

該解決方案始終是O(n),無論購買客戶的分佈。我也希望它是迄今爲止在大型數據集上最快的。

相關問題