我想在DataGridView
中显示客户的会计历史记录,并且希望有一列显示其余额的运行总计。我执行此操作的旧方法是获取数据,遍历数据,然后将行一一添加到DataGridView
并计算当时的运行总数。瘸。我宁愿使用LINQ to SQL,或者如果无法与LINQ to SQL一起使用LINQ来计算运行总计,因此我可以将DataGridView.DataSource
设置为我的数据。
这是我要拍摄的照片的超简化示例。说我有以下类(class)。
class Item
{
public DateTime Date { get; set; }
public decimal Amount { get; set; }
public decimal RunningTotal { get; set; }
}
我想要一个L2S或LINQ语句,它可以生成如下所示的结果:
Date Amount RunningTotal
12-01-2009 5 5
12-02-2009 -5 0
12-02-2009 10 10
12-03-2009 5 15
12-04-2009 -15 0
请注意,可以有多个具有相同日期(12-02-2009)的项目。在计算运行总计之前,应按日期对结果进行排序。我猜这意味着我将需要两个语句,一个用于获取数据并对其进行排序,第二个用于执行运行中的总计计算。
我希望
Aggregate
可以解决问题,但它并不像我希望的那样起作用。也许我只是想不通。这个question似乎跟我想要的一样,但是我看不出被接受的/唯一的答案如何解决我的问题。
关于如何实现这一目标的任何想法?
编辑
总结一下Alex和DOK的答案,这就是我最终得到的结果:
decimal runningTotal = 0;
var results = FetchDataFromDatabase()
.OrderBy(item => item.Date)
.Select(item => new Item
{
Amount = item.Amount,
Date = item.Date,
RunningTotal = runningTotal += item.Amount
});
最佳答案
使用闭包和匿名方法:
List<Item> myList = FetchDataFromDatabase();
decimal currentTotal = 0;
var query = myList
.OrderBy(i => i.Date)
.Select(i =>
{
currentTotal += i.Amount;
return new {
Date = i.Date,
Amount = i.Amount,
RunningTotal = currentTotal
};
}
);
foreach (var item in query)
{
//do with item
}
关于c# - LINQ to SQL和有序结果的总计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1834753/