C# 如何从具有相同键但累积值的另一个字典填充字典
我正在寻找一个使用C#,LINQ解决练习的帮助 我有一本字典,它的键是C# 如何从具有相同键但累积值的另一个字典填充字典,c#,linq,C#,Linq,我正在寻找一个使用C#,LINQ解决练习的帮助 我有一本字典,它的键是DateTime,值是decimal。我正在尝试编写一个方法,返回另一个字典,该字典的值是该年内前几个月和当前月份的所有值的总和。在接下来的一年里,这个过程会重复 输入字典: 01/31/2015 100 02/28/2015 100 03/31/2015 100 ; ; and so on ; 01/31/2017 200 02/28/2017 200 03/31/2017 200 输出应如下所示: 01/31
DateTime
,值是decimal
。我正在尝试编写一个方法,返回另一个字典,该字典的值是该年内前几个月和当前月份的所有值的总和。在接下来的一年里,这个过程会重复
输入字典:
01/31/2015 100
02/28/2015 100
03/31/2015 100
;
; and so on
;
01/31/2017 200
02/28/2017 200
03/31/2017 200
输出应如下所示:
01/31/2015 100
02/28/2015 200
03/31/2015 300
;
;
01/31/2017 200
02/28/2017 400
03/31/2017 600
以下是我到目前为止所做的。它计算下一年的总数,但不重置。2016年1月,它将1月的价值增加到之前的金额中。我想在编写aggregate()之前需要一个GroupBy
public static IDictionary RunningTotal\u NotResettingForNextYear(此IDictionary输入字典)
{
字典运行全称=
新字典(inputDictionary.Count);
inputDictionary.Aggregate((十进制?)0,(和,值)=>
{
总和=总和+价值。价值;
RunningTotalDictionary.Add(value.Key,sum);
回报金额;
});
返回RunningTotalDictionary;
}
缺少的部分是GroupBy
方法
- 首先,按年度分组输入字典
- 然后用累加器(F#inspired)逐组计算每个项目的新值
- 将组合并到一个列表中
- 创建新词典
var newDico = inputDictionary.OrderBy(i => i.Key).GroupBy(i => i.Key.Year).SelectMany(
group =>
{
decimal? accumulator = 0;
return
group.Select(
element =>
new { Key = element.Key, Value = (accumulator += element.Value)});
}).ToDictionary(accGroupItem => accGroupItem.Key, accGroupItem => accGroupItem.Value);
或使用临时累加器字典:
var dicoAcc = inputDictionary
.Select(i => i.Key.Year)
.Distinct()
.ToDictionary(year => year, _ => (decimal?)0);
var newDico = inputDictionary
.ToDictionary(i => i.Key, i => dicoAcc[i.Key.Year] += i.Value);
缺少的部分是
GroupBy
方法
- 首先,按年度分组输入字典
- 然后用累加器(F#inspired)逐组计算每个项目的新值
- 将组合并到一个列表中
- 创建新词典
var newDico = inputDictionary.OrderBy(i => i.Key).GroupBy(i => i.Key.Year).SelectMany(
group =>
{
decimal? accumulator = 0;
return
group.Select(
element =>
new { Key = element.Key, Value = (accumulator += element.Value)});
}).ToDictionary(accGroupItem => accGroupItem.Key, accGroupItem => accGroupItem.Value);
或使用临时累加器字典:
var dicoAcc = inputDictionary
.Select(i => i.Key.Year)
.Distinct()
.ToDictionary(year => year, _ => (decimal?)0);
var newDico = inputDictionary
.ToDictionary(i => i.Key, i => dicoAcc[i.Key.Year] += i.Value);
查看您的输出,似乎每年的总重置数都与方法名称
RunningTotal\u notresetingfornextyear
相矛盾查看您的输出,似乎每年的总重置数都与方法名称RunningTotal\u notresetingfornextyear
相矛盾,非常感谢你。我尝试了第二个建议“临时累加器字典”,效果非常好。我也会试试第一种。嗨,卡尔顿,非常感谢你。我尝试了第二个建议“临时累加器字典”,效果非常好。我也会尝试第一个选项。嗨,瓦布拉布,谢谢你花时间回答我的问题。这个解决方案也起了作用。无法推荐两个答案:-(您好,wablab,感谢您花时间回答我的问题。此解决方案也有效。无法推荐两个答案:-(