C# 如何从具有相同键但累积值的另一个字典填充字典

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

我正在寻找一个使用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/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,感谢您花时间回答我的问题。此解决方案也有效。无法推荐两个答案:-(