我想在中显示客户的会计记录,DataGridView并且希望有一列显示其余额的运行总额。我这样做的旧方法是获取数据,遍历数据,并将数据行DataGridView一一添加,然后计算当时的运行总数。瘸。我宁愿使用LINQ to SQL,或者如果无法与LINQ to SQL一起使用LINQ来计算运行总计,那么我就可以设置DataGridView.DataSource数据。
DataGridView
DataGridView.DataSource
这是我要拍摄的照片的超简化示例。说我有以下课程。
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能够做到这一点,但是它并没有像我希望的那样起作用。也许我只是想不通。
Aggregate
这个问题似乎跟我想要的一样,但是我看不出被接受的/唯一的答案是如何解决我的问题的。
关于如何实现这一目标的任何想法?
编辑 梳理来自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 }