将GroupBy的结果汇总成一个Dictionary

时间:2016-04-18 20:43:15

标签: c# linq

所以我有一个对象列表:

class myObj{   
  string type;   
  int amount;
}

如何按“类型”字段进行分组,总结每种类型下的金额,然后将结果放入字典?这是我得到的:

myList
  .GroupBy(x=>x.type)
  .ToDictionary(
    x=>x.Key, 
    x=>x.GetEnumerator().Sum(y=>y.amount)
  );

我得到的错误是:

IEnumerator does not contain a definition for Sum

要小心它说“IEnumerator”而不是IEnumerable。

3 个答案:

答案 0 :(得分:3)

您不需要致电GetEnumerator(),只需在群组中使用Sum()方法:

myList.GroupBy(x => x.type)
      .ToDictionary(x => x.Key, x => x.Sum(y => y.amount));

Sum()IEnumerable<T>的扩展方法,而不是IEnumerator<T>的扩展方法。由于IGrouping<TKey, TElement>继承自IEnumerable<TElement>,因此您可以在此类对象中使用 Linq 扩展名。

答案 1 :(得分:0)

见下面的代码:

myList
  .GroupBy(x=>x.type)
  .ToDictionary(
    x=>x.Key, 
    x=>x.Sum(y=>y.amount)
  );

IGrouping<Key, T>IEnumerable<T>

答案 2 :(得分:0)

你需要一个集合对象myObj。使用List&lt;&gt;更容易对象如下面的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<myObj> objs = new List<myObj>();
            Dictionary<string, int> dict = objs.AsEnumerable()
                .GroupBy(x => x.type, y => y)
                .ToDictionary(x => x.Key, y => y.Select(z => z.amount).Sum());
        }
    }
    public class myObj
    {
        public string type { get; set; }
        public int amount { get; set; }
    }

}