Группировать список словарей по словарю-ключу (C #) - PullRequest
1 голос
/ 06 октября 2011

У меня есть список словарей типа <String, String>. В словарях есть ключи Доход и Месяц.

Типичная запись может быть: Доход = "10.080", Месяц = ​​"1/2011"

Я хотел бы получить итоговые данные о доходах за каждый месяц, поэтому я попытался:

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

Это не работает. Выражение d["Month"]) подчеркнуто.

Невозможно применить индексирование с помощью [] к выражению типа «десятичный».

Ответы [ 3 ]

6 голосов
/ 06 октября 2011

Результат вашего 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>, принимая ключ группы (месяц) в качестве ключа словаря, а сумму значений группы в качестве значения словаря.

3 голосов
/ 06 октября 2011
List<decimal> monthsTotals = data
  .GroupBy(d => d["Month"])
  .Select(d => d.Sum( r => Convert.ToDecimal(r["Revenue"])))
  .ToList<decimal>();
0 голосов
/ 06 октября 2011

Превратите эти словари во что-то полезное.

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();
...