2016-12-25 12 views
0

Ich habe eine Klasse wie folgt definiert:Linq Gruppe durch spezifische Eigenschaft einer Klasse und dann min und max-Wert nehmen

public class GroupedItem 
{ 
    public DateTime _Date { get; set; } 
    public int Sales { get; set; } 
    public float TransactionPrice { get; set; } 

    public string Seller { get; set; } 

    // Part used for calculation 
    public float BestSellerAveragePrice { get; set; } 
    public float MinPrice { get; set; } 
    public float MaxPrice { get; set; } 
} 

Und dann habe ich es mit einer Liste von GroupedItem Typ wie folgt gefüllt:

List<GroupedItem> _groupedItems = new List<GroupedItems>(); 

Nehmen wir an, die Liste hat 300 Elemente, deren einzige initialisierte Werte die ersten vier Eigenschaften wie oben sind. Der Teil mit Min-, Max- und Durchschnittspreis ich nach einer Gruppe wie durch Anweisung füllen werde folgende:

ViewBag.PriceAnalytics = _groupedItems.GroupBy(x => x.Seller).Select(gi => new GroupedItem() { MinPrice = x. }).ToList(); 

Wie Sie mir Gruppierung von Verkäufern Eigentum sehen alle Verkäufe für die Nutzer zu bekommen, die etwas verkauft und nach dem spezifischen Preis.

Was ich versuche zu tun ist, zuerst alle diese Preise zu summieren, die sie verkauft haben, und dann einen minimalen und maximalen Wert herauszunehmen. Also, wenn die Eingangswerte waren:

Seller Mike, 21.12.2016, 1 sale, 48$ 
Seller Mike, 21.12.2016, 1 sale, 24$ 
Seller Mike, 21.12.2016, 1 sale, 29$ 


Seller Jenna, 21.12.2016, 1 sale, 20$ 
Seller Jenna, 21.12.2016, 1 sale, 39$ 
Seller Jenna, 21.12.2016, 1 sale, 56$ 

Seller Josh, 21.12.2016, 1 sale, 10$ 
Seller Josh, 21.12.2016, 1 sale, 28$ 
Seller Josh, 21.12.2016, 1 sale, 39$ 

Die gewünschte Ausgabe wäre:

Seller Mike, 21.12.2016, 3 sales, 101$ 
Seller Jenna, 21.12.2016, 3 sales, 115$ 
Seller Josh, 21.12.2016, 3 sales, 77$ 

Nach einer ersten Gruppe von .. Jetzt möchte ich alle Verkäufer hat und dessen Gesamtumsatz mit ihrem Gesamtergebnis.

Nun, was brauche ich mit diesen drei Werten zu tun:

101, 115, 77 

Mindestpreis würde $ 77 sein, und max Preis wäre 115 $

Wie kann dies mit LINQ tun?

Antwort

0

Sie sind fast da, nach dem Einschalten Verkäufer Gruppierung, müssen Sie jede Gruppe nacheinander verarbeiten, finden Sie unter:

List<GroupedItem> result = new List<GroupedItem>(); 
var groupedResult = _groupedItems.GroupBy(x=>x.Seller); 

foreach(var grouping in groupedResult) 
{ 

    var row = grouping.First(); 

    row.TransactionPrice = grouping.Sum(x=>x.TransactionPrice); 
    row.Sales = grouping.Sum(x=>x.Sales); 

    result.Add(row); 
} 

DEMO FIDDLE

0

Sie auch eine Liste der zusammengefassten Daten mit LINQ bekommen könnte Abfrage:

var data = (from gp in test 
      group gp by gp.Seller into g 
      select new GroupedItem 
      { 
       Seller = g.Key, 
       _Date = g.First()._Date, 
       Sales = g.Sum(x => x.Sales), 
       TransactionPrice = g.Sum(x => x.TransactionPrice) 
      }).ToList(); 
var best = data.Max(x => x.TransactionPrice); 
var worst = data.Min(x => x.TransactionPrice);