C# 一行中每x个值求和一次
我有一列C# 一行中每x个值求和一次,c#,vb.net,linq-to-dataset,C#,Vb.net,Linq To Dataset,我有一列日历周和一列金额。现在,我想从4月份的第一个日历周开始,计算每4个日历周的金额。例如,如果我的初始表格中有52(行)个日历周,那么我的最终表格中将有13(行)个日历周(我在这里谈论表格,因为我稍后将尝试将结果绑定到DGV) 我正在使用Linq数据集,并尝试了不同的来源来获得如何解决此问题的提示,但group by、aggregate无法帮助我,但可能有一些我不了解的应用程序,所以我希望你们中的Linq专家能够帮助我 通常我会发布代码,但我可以给你主干,因为我没有起点 _dataset =
日历周
和一列金额
。现在,我想从4月份的第一个日历周开始,计算每4个日历周的金额。例如,如果我的初始表格中有52(行)个日历周,那么我的最终表格中将有13(行)个日历周(我在这里谈论表格,因为我稍后将尝试将结果绑定到DGV)
我正在使用Linq数据集,并尝试了不同的来源来获得如何解决此问题的提示,但group by、aggregate无法帮助我,但可能有一些我不了解的应用程序,所以我希望你们中的Linq专家能够帮助我
通常我会发布代码,但我可以给你主干,因为我没有起点
_dataset = New Dataset1
_adapter.Fill(_dataset.Table1)
dim query = from dt in _dataset.Table1.AsEnumerable()
将一周除以四(使用整数除法截断结果),生成一个可以分组的值。您可以根据需要分组。理论上,您可以使用一个简单的递增数字:
var groups = dt
.Select((row, i) => Tuple.Create(row, i / 4))
.GroupBy(t => t.Item2);
(c#符号)
然后,您可以计算每个组的总和:
var sums = groups
.Select(g => g.Sum(t => t.Item1.Amount));
你提到你想在某个月开始,例如四月。您可以使用skip
或Where
跳过行:
dt.Skip(12).Select(...)
i
将始终从0开始,确保您的第一组包含4周。然而,要确切知道要跳过多少周或从哪里开始,您需要更多的日历信息。我假设您的行中有一些字段提到了相应的一周开始日期:
dt.Where(row => row.StartDate >= firstOfApril).Select(...)
首先将数据转换为月份和金额的查找。注意,您的列需要调用
CalendarWeek
和Amount
。然后转换为字典并对每个键的值求和:
var grouped = dt.AsEnumerable().ToLookup(o => Math.Ceiling((double) o.Field<int>("CalendarWeek")/4), o => o.Field<double>("Amount"));
var results = grouped.ToDictionary(result => result.Key, result => result.Sum());
var group=dt.AsEnumerable().ToLookup(o=>Math.天花((double)o.Field(“日历周”)/4),o=>o.Field(“金额”);
var results=grouped.ToDictionary(result=>result.Key,result=>result.Sum());
日历周列的值是多少?你能发布一些示例数据吗?即使在这种情况下,如果值不同,你将如何对它们进行分组?我相信你说的是SQLgroup by
@Rahul将周数除以四的行为会导致前四周、第四周到第八周的每一周都具有相同的值。您可以使用GroupBy
对该值进行分组,正如您所说的,您已经尝试过了。您好!谢谢你的提示!我现在所做的是将CWeek=(dt.week/4)添加到Total=Sum(dt.amount)中。所有这些变化都是周数从(1->0.25,2->0.5等)变化。你能再推我一下吗?@ruedi就像我说的,你需要执行整数除法,这样结果就会被截断成整数。如果周当前不是整数,则应将其转换为整数。@Servy,这是什么意思?这些项目将按列值“日历周”分组,而不是按索引分组。不过,我没有注意到您所做的一切,您的帖子实际上是错误的,而不仅仅是使用了多余的方法。@Servy-您能准确解释一下您的意思吗?OP提到了一个数据集,每个日历周有一行数据,他们希望每四周汇总一次数据量。所以,第0周到第3周是前四周Select((row,i)=>Tuple.Create(row,i/4))
为每一行分配一个数字,最后在第一组中包含行0..3等。您认为我的错误在哪里?错误在于您应该根据week列的值对行进行分组,而不是根据结果集中的项目索引。