按字典键(C#)的字典组列表

时间:2011-10-06 10:16:50

标签: c# linq dictionary group-by

我有一个<String, String>类型的词典列表。词典有关键收入和月。

典型条目可能是:Revenue =“10.080”,Month =“1/2011”

我想获得每个月的收入总额,所以我尝试了:

List<decimal> monthsTotals = data.Select(d => Convert.ToDecimal(d["Revenue"]))
    .GroupBy(d => d["Month"]).ToList<decimal>();

这不起作用。表达式d["Month"])带有下划线。

  

无法将带有[]的索引应用于“decimal”类型的表达式。

3 个答案:

答案 0 :(得分:6)

Select的结果只是收入。你正在丢失所有其他信息。我怀疑你想要:

Dictionary<string, decimal> revenueByMonth =
    data.GroupBy(d => d["Month"], d => decimal.Parse(d["Revenue"]))
        .ToDictionary(group => group.Key, group => group.Sum());

第一步创建IGrouping<string, decimal> - 即每个月创建一系列收入值。

第二步,将组密钥(月份)作为字典键,将组值的总和作为字典值,将其转换为Dictionary<string, decimal>

答案 1 :(得分:3)

List<decimal> monthsTotals = data
  .GroupBy(d => d["Month"])
  .Select(d => d.Sum( r => Convert.ToDecimal(r["Revenue"])))
  .ToList<decimal>();

答案 2 :(得分:0)

将这些词典变成有用的词。

public class RevenueData
{
   public decimal Revenue {get;set;}
   public string Month {get;set;}
}

List<RevenueData> result = data
  .Select(d => new RevenueData()
    { Revenue = Convert.ToDecimal(d["Revenue"]), Month = d["Month"] })
  .GroupBy(x => x.Month)
  .Select(g => new RevenueData()
    { Revenue = g.Sum(x => x.Revenue), Month = g.Key })
  .ToList();