2010-10-26 5 views
5

Ich möchte etwas ähnliches wie this erreichen. Aber ich weiß nicht, auf welche Weise ich diese Lösung benutzen kann.Teilen Sie eine Sammlung in Teile basierend auf dem Zustand mit LINQ?

hat mein Unternehmen diese Eigenschaften

CustomerName 
Date 
SortOrder 

Ich habe ganze Liste dieser Entität. Was ich tun möchte, ist, Gruppe alle diese Elemente in List <> die Datum und gleiche Kundenname in Folge SortOrder und gleiche haben

Beispiel Eingang

var inv = new List<Invoice>(){ 
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 0}, 
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 1}, 
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 2}, 
    new Invoice(){ CustomerName = "xyz" ,Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 3}, 
    new Invoice(){ CustomerName = "xyz" ,Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 4}, 
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 5}, 
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 6} 
    }; 

Beispiel Ausgabe

var invGrouped = new List<List<Invoice>> 
    { 
    new List<Invoice> 
     { 
     new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 0}, 
     new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 1}, 
     new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 2} 
     }, 
    new List<Invoice> 
     { 
     new Invoice {CustomerName = "xyz", Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 3}, 
     new Invoice {CustomerName = "xyz", Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 4} 
     }, 
    new List<Invoice> 
     { 
     new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 5}, 
     new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 6} 

     } 
    }; 

UPDATE
Nicht-LINQ-Lösung wird ebenfalls ausreichen.

+2

Es sehr helfen würde, wenn Sie eine kleine Probe von Daten sowie genau enthalten könnten, was Sie erwarten, dass die Daten zu sehen aus wie es einmal gruppiert wurde. – diceguyd30

+0

@ diceguyd30! Ich habe die Frage – IsmailS

+0

aktualisiert. Warum sind die beiden untersten Zeilen (mit CustomerName "Abc" und DateTime of Today) nicht in der gleichen Liste wie die anderen Bestellungen von Kunden "Abc", die heute aufgegeben wurden? –

Antwort

5

Hier ist eine mögliche LINQ Antwort, obwohl ich bin sicher, dass ein effizienter ein solches vorhanden ist:

inv 
     .GroupBy(x => new { CustomerName = x.CustomerName, Date = x.Date }) 
     .SelectMany(x => x 
          .OrderBy(y => y.SortOrder) 
          .Select((y,i) => new { Value = y, Sort = y.SortOrder - i }) 
          .GroupBy(y => y.Sort) 
          .Select(y => y.Select(z => z.Value)) 
     ) 
+0

+1 Vielen Dank. Gerade jetzt nach Hause gehen. Werde es morgen versuchen. – IsmailS

+0

Sie sind großartig! Es funktioniert erstaunlich !!! Du hast mir viel Kopfschmerz und Zeit gespart. Ich bin dir dankbar. – IsmailS

+0

Kein Problem! Froh, dass es funktioniert hat! – diceguyd30

Verwandte Themen