2012-06-23 192 views
1

在我的代碼,我創建了下面的類的List<>數據聚合

public class Calculations 
{ 
     public int Year { get; set; } 
     public double Payment { get; set; } 
     public double AnnualInterest { get; set; } 
     public double AnnualPrincipalSplit { get; set; } 
     public double NLVBalance { get; set; } 
     public double apportionedValue { get; set; } 
     public double OpenMarketValue { get; set; } 
     public double NotionalLoan { get; set; } 
     public double ResidencyFee { get; set; } 
     public double BalanceOfShare { get; set; } 
     public double TotalShareOwnedOutright { get; set; } 
     public double TotalEquity { get; set; } 
} 

列表保存它代表的投資(比如超過30年的長期數據,也將在30個項目列表)

我有一個名爲globalReviewPeriod變量,它是一個整數,這是用來定義當在列表中的數據應該在此聚集的(例如,如果該globalReviewPeriod爲5,投資的術語是30年,那麼數據將需要在5年,10年,15年,20年,25年和30年)彙總。

聚合本身非常簡單,它只是包含在類中的數據的累積值。

但是,鑑於我上面定義的邏輯(即在審查期間),我正在努力處理如何彙總數據的邏輯。

任何指針都會被感激地收到。

回答

6

使用Where過載,可以讓你基於索引進行過濾:

var result = listCalculations 
    .Where((x, index) => index % globalReviewPeriod == 0) 
    .Sum(...); // Put some aggregation here. 

從文檔,lambda函數的使用步驟如下:

謂詞

類型:System.Func

A函數來測試每個源元素的條件;函數的第二個參數表示源元素的索引。

請注意,上面的代碼將始終包含第一項,因爲它具有索引0,可以被每個數字整除。你不妨用(index + 1),而不是index如果你想使用基於1的索引,其中第一個元素索引1

var result = listCalculations 
    .Where((x, index) => (index + 1) % globalReviewPeriod == 0) 
    .Sum(...); // Put some aggregation here. 
+1

愛LINQ,節省了代碼那麼多行! – Charleh

+0

在這種情況下,x和我代表Mark嗎? –

+0

謝謝馬克,我明白了:) –