2016-04-18 4 views
0

So habe ich eine Liste von Objekten:Summieren GroupBy führt in ein Wörterbuch

class myObj{ 
    string type; 
    int amount; 
} 

Wie Gruppe I durch das Feld „Typ“, unter jeder Art, die Menge summieren, dann legte das Ergebnis in einem Wörterbuch ? Hier ist, was ich habe:

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

Der Fehler, den ich bekommen, ist dies:

IEnumerator does not contain a definition for Sum 

Seien Sie sehr vorsichtig es sagen "IEnumerator" und nicht IEnumerable.

Antwort

3

Sie brauchen nicht GetEnumerator() zu nennen, verwenden Sie einfach Sum() Methode in der Gruppe:

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

Sum() ist eine Erweiterung Methode von IEnumerable<T>, nicht von IEnumerator<T>. Seit IGrouping<TKey, TElement> erbt von IEnumerable<TElement> können Sie Linq Erweiterungen in dieser Art von Objekten verwenden.

0

Siehe Code unten:

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

IGrouping<Key, T> ist IEnumerable<T>

0

Sie benötigen ein Sammelobjekt für Sie Klasse myObj. Es ist einfacher, ein List <> -Objekt wie den folgenden Code zu verwenden.

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; } 
    } 

}