2012-06-23 142 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

谢谢马克,我明白了:) –