2011-01-13 10 views
5

Ich habe so etwas wie dies in einem List<object> wo object enthält Cat, Type und Items.Gruppieren von Daten und machen Aggregatberechnungen in C#

Cat | Type | Items 
-------------------- 
A | P | 3 
A | Q | 4 
A | R | 2 
A | P | 1 
A | Q | 5 
B | P | 2 
B | Q | 1 
B | R | 3 
B | P | 9 

Was ich tun möchte, ist die durchschnittliche Elemente der Typen zu berechnen, so etwas wie folgt produzieren:

Cat | Type | Items 
-------------------- 
A | P | 2 
A | Q | 4.5 
A | R | 2 
B | P | 5.5 
B | Q | 3 
B | R | 5 

Wie Sie die mittleren Elemente werden berechnet für die Typen sehen Was ist der beste Weg, um dies zu tun?

+0

können Sie umfassen eine Linie auf, was die Datenstruktur aussieht? eine Liste von Tupeln? – vlad

+2

@vlad: Ich würde ein Objekt mit drei Eigenschaften annehmen. – Joey

+0

sorry, ja, Liste der Objekttypen mit 3 Eigenschaften – flammable11

Antwort

7

den Eingang Angenommen wird in einer Variablen vorgesehen list vom Typ genannt IEnumerable<Blah> (enthalten, beispielsweise ein Datenbankabfrageer ein List<Blah>, ein Array, etc.etc.) Und daß Blah ist eine Klasse mit Feldern oder Eigenschaften Cat, Type und Items genannt:

var result = list.GroupBy(entry => new { entry.Cat, entry.Type }) 
       .Select(group => new { group.Key.Cat, group.Key.Type, 
             Items = group.Average(e => e.Items) }) 
2
class Stuff 
{ 
    public string Cat { get; set; } 
    public string Type { get; set; } 
    public double Items { get; set; } 
} 

static void Main(string[] args) 
{ 
    var list = new List<Stuff>(); 
    list.Add(new Stuff { Cat = "A", Type = "P", Items = 3 }); 
    list.Add(new Stuff { Cat = "A", Type = "Q", Items = 4 }); 
    list.Add(new Stuff { Cat = "A", Type = "R", Items = 2 }); 
    list.Add(new Stuff { Cat = "A", Type = "P", Items = 1 }); 
    list.Add(new Stuff { Cat = "A", Type = "Q", Items = 5 }); 
    list.Add(new Stuff { Cat = "B", Type = "P", Items = 2 }); 
    list.Add(new Stuff { Cat = "B", Type = "Q", Items = 1 }); 
    list.Add(new Stuff { Cat = "B", Type = "R", Items = 3 }); 
    list.Add(new Stuff { Cat = "B", Type = "P", Items = 9 }); 

    var result = from stuff in list 
       group stuff by new { stuff.Cat, stuff.Type } into g 
       select new { Cat = g.Key.Cat, 
           Type = g.Key.Type, 
           AvgItems = g.Average(s => s.Items) }; 

    foreach(var s in result) 
    { 
     Console.WriteLine("{0} | {1} | {2}", s.Cat, s.Type, s.AvgItems); 
    } 
} 
Verwandte Themen