使用LINQ按一个字段分组,总和基于组并存储在字典

时间:2016-11-24 11:22:57

标签: c# linq dictionary

我很难取得成果,因为我误解了sintax。案例如下:

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

ItemID是项目的标识符,它在列表中不是唯一的,因此我必须将其分组并记录此项目出现的次数。我通过以下方式实现了这一目标:

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

因此,我使用ItemID获取我的字典,现在是唯一的,以及项目在我的列表中显示的总时间。

我正在努力实现的部分是将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)) };

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

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

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

我已尝试过此论坛和其他地方的其他解决方案,但他们通常不会在字典中添加值。

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

  1. 正是我上面要求的,我会得到一个 我的列表中的所有项目分组的字典 ItemID及其各自项目的总和.TotalNet;
  2. FROM:

      

    第1项,第10项

      第2,15条

      第2,15条

    TO:

      

    第1项,第10项

      第2项,第30页

    OR:  2.一个var / decimal /无论什么让我返回当前的TotalNet     ItemID迭代(我可以使用foreach /以后的代码来     实现我正在寻找的结果)。所以要清楚,这个TotalNet     必须是我的列表中具有相同ItemID的所有TotalNets的总和     我正在迭代。像“我在ItemID 1上的东西,     从列表“。”中总结所有ItemID 1的TotalNet。

    老实说......我想帮助第一个选项,为了学习,但无论采用什么方法都能得到解决方案(以旧神的名义牺牲孩子来获得我的输出不会被标记为解决方案......并可能被投票支持)。

2 个答案:

答案 0 :(得分:3)

这样的事情会起作用吗?

list.GroupBy(x => x.ItemID)
    .ToDictionary(x => x.Key, 
                  x => x.Sum(t => Convert.ToDecimal(t.TotalAmountPaid)));

答案 1 :(得分:1)

@bashis答案在功能上是你要找的。我以为我可以解释一下逻辑。

您有一个列表,其中包含ItemID作为标识符的项目,TotalNet作为金额,以字符串形式给出。您希望使用相同的ItemId计算所有元素的TotalNet总和,并将结果存储在字典中。

首先,我们从GroupBy语句开始。它接受一个lambda,用于确定列表中的哪些项目组合在一起。它的返回值:

  

GroupBy(IEnumerable,Func,Func)方法返回一组IGrouping对象,每个对象遇到一个不同的密钥。 IGrouping是一个IEnumerable,它还有一个与其元素相关联的密钥。

所以你得到了一组群。每个组都包含所有元素的枚举,这些元素为您在GroupBy语句中输入的分组表达式返回相同的值。在我们的示例中,所有具有相同ItemId的元素。此外,用于每个组的ItemId的值被存储为组的键。

此解决方案中提供的最后一步使用ToDictionary方法。即,这种味道:

public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TSource, TElement> elementSelector
)

这里,我们需要传递两个函数 - 一个用于选择用于字典的键,另一个用于创建将存储在字典中的值。 对于键选择器,我们选择组的键,而键是元素的ItemId。对于值,请记住每个组包含具有相同ItemId的所有元素,因此我们可以只计算TotalAmountPaid值(从字符串转换为十进制)并获得所需的结果。