我很难取得成果,因为我误解了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
我已尝试过此论坛和其他地方的其他解决方案,但他们通常不会在字典中添加值。
我可以接受两种方案作为解决方案:
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。
老实说......我想帮助第一个选项,为了学习,但无论采用什么方法都能得到解决方案(以旧神的名义牺牲孩子来获得我的输出不会被标记为解决方案......并可能被投票支持)。
答案 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值(从字符串转换为十进制)并获得所需的结果。