2016-11-26 29 views
1

我有兩個列表,其基本上是相同的類型的像以下:LINQ的組由ID,然後求和ID本身(鍵)

public class TransactionsTabResults 
{ 
    public string ItemID { get; set; } 
    public string Title { get; set; } 

    public string ItemImage { get; set; } 

    public float ItemPrice { get; set; } 

    public int PageViews { get; set; } 

    public float AveragePrice { get; set; } 

    public int TotalSoldItems { get; set; } 

    public float TotalRevenuePerItem { get; set; } 

} 

列表#1是TransactionsData,它包含250項其唯一的初始化屬性是:ItemID,Title和ItemPrice;

ItemID本身在第一個列表中重複多次。現在,我想要在第二列表(transactionsList)實現的是以下幾點:

var _transactionsList = TransactionsData.GroupBy(x => x.ItemID).Select(pr => new TransactionsTabResults { 
          ItemID = pr.Key, 
          Title = pr.Select(x => x.Title).FirstOrDefault(), 
    // here goes total sales of the item => sum of the groupby function by ItemID 
// here goes the average selling price => sum above divided by price of the item 
          TotalRevenuePerItem= pr.Sum(y=>y.ItemPrice) 
         }); 

正如你可以看到我試圖將所有的項目清單通過項目ID內,然後求和的關鍵,獲得每個項目的銷售額(如果你們明白我想要達到的目標) - 這個ID重複的次數是該項目的銷售額...

有人可以幫我解決想出解決辦法?

編輯:我需要得到鍵值(我被整個列表分組參數) - 價值/金額itemid的多少次重複自己在#1列表...

+0

@GiladGreen好吧我會發布和示例數據 – User987

+0

@GiladGreen:如果你有價格(每銷售)和銷售數量,很容易通過求和和求平均來生成總數和平均值... –

回答

4

你不」我想要「彙總ID」 - 您只需要使用Average方法得到的價格的平均值。如果你想算,只需要調用Count()

AverageRevenuePerItem = pr.Average(y => y.ItemPrice), 
TotalSalesPerItem = pr.Count() 

總結的標識 - 或進行任何其他類型的與他們的算術 - 始終是一個壞主意。如果它們以單調的順序生成,然後比較它們(對於較晚/較早/較高/較低的方面)可以是是有用的,但除此之外,應該將它們當作可以對只有進行比較的值。

另外,我會強烈建議您修改您的數據模型。目前,您已經混合了「這是一筆銷售」和「這是銷售的總和」。這隻會導致混亂。同樣,你不清楚你在交易中需要一個標題 - 應該在描述項目的單獨的表格/模型中。所以我可以看到你有類似的東西:

Item: 
    Id 
    Title 

Transaction: 
    ItemId 
    Price 

TransactionAggregation: 
    ItemId 
    TransactionCount 
    TotalRevenue 
    AverageRevenue // Redundant really, as it's just total revenue/transaction count 

我不知道頁面視圖適合哪種模型,如果有的話。

+0

haha​​h哇你做得這麼簡單......我不知道它可以輕鬆完成這一切..堅持我會嘗試這個代碼:) – User987

+0

平均函數採用ItemPrice並將其除以pr.Count()參數(在這種情況下是ItemID在#1列表中重複的次數)。我對麼? – User987

+0

@ User987:那麼,它會在內部完成這個計算,而不是通過調用Count()來完成,但是,這基本上是正確的。 –