2017-03-05 5 views
-1

Guten Tag. Ich möchte eine Liste von letzten 2 Monaten gruppieren und zählen, wie viele Produkte sind in jedem Monat und zählen auch eindeutige Kategorie für jedes Produkt in jedem Monat verkauftSo gruppieren Sie die Liste nach den letzten 2 Monaten und zählen Sie die einzelnen Artikel in C#

Ich habe eine Liste. Es enthält eine Klasse namens ProductTransaction.

List<ProductTransaction> productList = new List<ProductTransaction>(); 
class ProductTransaction 
{ 

    string product; 
    DateTime date_sold; 
    string category; 
} 

productList.Add(new ProductTransaction() {product="sword", date_sold=03/05/2017,category="weapons"}); 
productList.Add(new ProductTransaction() {product="sword2", date_sold=03/01/2017,category="weapons"}); 
productList.Add(new ProductTransaction() {product="potion", date_sold=02/05/2017,category="life"}); 
productList.Add(new ProductTransaction() {product="jacket", date_sold=02/03/2017,category="clothing"}); 
productList.Add(new ProductTransaction() {product="jacketofBear", date_sold=02/01/2017,category="clothing"}); 

Ich möchte eine Daten wie unten erreichen. Bitte beachten Sie angehängtes Bild

Month --  productCount  --  categoryCount 

March --    2   --    1 

February --    3   --    2 
+0

Was genau meinst du mit _Last zwei months_? Willst du damit sagen, dass wenn dein Beispiel mehr als 2 Monate umfasst, du nur 2 möchtest, und wenn ja, was 2. Willst du wirklich nur auf Monat gruppieren, oder sollte es Jahr berücksichtigen, wenn es Transaktionen für die gleicher Monat aber unterschiedliche Jahre? – juharr

+0

Ich möchte nur die letzten 2 Monate Transaktion mit dem date_sold sir erhalten. Zum Beispiel, Der Monat ist jetzt März, ich möchte nur März und Februar für dieses Jahr bekommen, Sir. –

+0

Sie sagen zweimal "ich will". Das * klingt * als ob man andere bittet, ihren Code zu schreiben. Ich bin sicher, du hast es selbst versucht, aber es würde helfen zu wissen, wo du feststeckst. –

Antwort

1

Zuerst das früheste Datum berechnen können Sie durch den aktuellen Tag ab dem aktuellen Datum subtrahieren den Beginn des aktuellen Monats zu bekommen und dann 1 Monat Subtrahieren den Anfang des vorherigen zu erhalten Monat. Dann würden Sie diese verwenden, um Ihre Sammlung zu filtern, dann nach Monat gruppieren und die eindeutige Anzahl der Produkte und Kategorien auswählen.

DateTime beginningOfPreviousMonth = DateTime.Today 
    .AddDays(-DateTime.Today.Day) 
    .AddMonths(-1); 
var results = productList.Where(p => p.date_sold.Date >= beginningOfPreviousMonth) 
    .GroupBy(p => p.date_sold.Month) 
    .Select(grp => new 
    { 
     Month = new DateTime(1,key,1).ToString("MMMM"), 
     ProductCount = grp.Select(x => x.product).Distinct().Count(), 
     CategoryCount = grp.Select(x => x.category).Distinct().Count() 
    }); 

foreach(var result in results) 
    Console.WriteLine(result); 
+0

Hallo Herr, ich habe versucht, Ihren Code, aber ich habe Schwierigkeiten bei der Anzeige der Daten –

+0

@ LanceKidd Das könnte sein, weil ich nicht tatsächlich das Ergebnis erfasst habe. Das habe ich jetzt behoben. Wenn das nicht das Problem ist, dann lass es mich wissen, was ist. – juharr

0

Versuchen folgende:

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

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ProductTransaction.productList = new List<ProductTransaction>() { 
       new ProductTransaction() {product="sword", date_sold= DateTime.Parse("03/05/2017"),category="weapons"}, 
       new ProductTransaction() {product="sword2", date_sold=DateTime.Parse("03/01/2017"),category="weapons"}, 
       new ProductTransaction() {product="potion", date_sold=DateTime.Parse("02/05/2017"),category="life"}, 
       new ProductTransaction() {product="jacket", date_sold=DateTime.Parse("02/03/2017"),category="clothing"}, 
       new ProductTransaction() {product="jacketofBear", date_sold=DateTime.Parse("02/01/2017"),category="clothing"} 
      }; 

      var results = ProductTransaction.productList 
       .Where(x => (x.date_sold >= DateTime.Parse("1/1/2017")) && (x.date_sold <= DateTime.Parse("3/31/2017"))) 
       .GroupBy(x => x.date_sold.Month) 
       .Select(x => new 
       { 
        month = x.Key, 
        year = x.FirstOrDefault().date_sold.Year, 
        category_count = x.GroupBy(y => y.category).Count(), 
        product_count = x.Count() 
       }).ToList(); 
     } 
    } 

    class ProductTransaction 
    { 
     public static List<ProductTransaction> productList = new List<ProductTransaction>(); 

     public string product; 
     public DateTime date_sold; 
     public string category; 
    } 
} 
+1

Während dieses Codefragment die Frage des OP beantworten kann, wäre die Antwort nützlicher, wenn Sie eine Erklärung hinzufügen würden. Beachten Sie, dass Code-Only-Antworten zur Qualitätsüberprüfung gekennzeichnet werden, wodurch sie möglicherweise gelöscht werden. –

+0

Hallo Herr, Ihr Code funktioniert gut, um die eindeutige Anzahl für die Kategorie und Anzahl der Produkte zu bekommen, aber wie kann ich es nur in den letzten 3 Monaten dieses Jahres begrenzen? –

+0

Ich habe eine WHERE hinzugefügt, um die Ergebnisse zu filtern. Siehe aktualisierten Code. – jdweng

Verwandte Themen