使用LINQ按一个字段进行分组,基于组求和并存储在字典中

Est*_*ago 2 c# linq dictionary

我很难取得结果,可能是因为我误解了 sintax。这里是案例:

我有一个输出列表的类。在此列表中,有两个我特别想要的字段。它们是 ItemID(字符串)和 TotalNet(字符串)。还有其他字段,但我现在不需要使用它们,但我稍后会在代码中使用它们。

ItemID 是一个 Item 的标识符,它在列表中不是唯一的,所以我必须将它归为一个并计算该 item 出现的次数。我通过以下方式实现了这一目标:

Dictionary<string, int> dstLoops = list.Select(l => l.ItemID).ToList()
                .GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count());
Run Code Online (Sandbox Code Playgroud)

因此,我获取带有 ItemID(现在是唯一的)的字典,以及该 Item 在我的列表中出现的总次数。

我正在努力实现的部分是将 ItemID 出现在列表中的所有时间的 TotalNet 相加。

我设法用这个得到了它:

var APTotal = from i in list group i by i.ItemID into g select new
            { total = g.Key, totals = g.Sum(i =>Convert.ToDecimal(i.TotalAmountPaid)) };
Run Code Online (Sandbox Code Playgroud)

问题是,它不是字典,稍后在代码中会让人头疼......好吧......不多但我想避免它,所以我尝试了:

 Dictionary<string, decimal> liststotal = list.Select(l => l.ItemID).ToList().
                GroupBy(x => x).ToDictionary(g => g.Key, g => g.Sum(Convert.ToDecimal(item.TotalAmountPaid)));
Run Code Online (Sandbox Code Playgroud)

不幸的是,它返回我无法将十进制转换为 System.Func

我已经尝试了这个论坛和其他地方的一些其他解决方案,但它们通常不会向字典添加值。

我可以接受两种情况作为解决方案:

  1. 正是我上面所要求的,我将得到一本字典,其中包含我的列表中的所有项目,按 ItemID 及其各自 item.TotalNet 的总和分组。

从:

项目1, 10

项目2, 15

项目2, 15

到:

项目1, 10

项目2, 30

或者:2. var/decimal/whatever 返回当前 ItemID 迭代的 TotalNet(我可以在代码中使用 foreach/for 来实现我正在寻找的结果)。因此,需要明确的是,这个 TotalNet 必须是我目前正在迭代的列表中具有相同 ItemID 的所有 TotalNet 的总和。类似于“我在 ItemID 1 上,去对列表中 ItemID 1 的所有 TotalNet 进行求和”。

老实说......为了学习,我希望获得第一个选项的帮助,但无论如何,解决方案都是值得赞赏的(以旧神的名义牺牲孩子来获得我的输出不会被标记为解决方案......并可能被否决)。

bas*_*his 5

像这样的东西会起作用吗?

list.GroupBy(x => x.ItemID)
    .ToDictionary(x => x.Key, 
                  x => x.Sum(t => Convert.ToDecimal(t.TotalAmountPaid)));
Run Code Online (Sandbox Code Playgroud)