2010-10-26 12 views
5

Chcę osiągnąć coś podobnego do this. Ale nie wiem, w jaki sposób mogę użyć tego rozwiązania.Podział kolekcji na części na podstawie stanu z LINQ?

Moja jednostka ma te właściwości

CustomerName 
Date 
SortOrder 

Mam całą listę tego podmiotu. Co chcę zrobić, to grupa wszystkie te pozycje na liście <>, które mają kolejne SortOrder i sam Data i sam CustomerName

Przykład wejściowego

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

Przykâadowa

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
Rozwiązanie inne niż LINQ również będzie wystarczające.

+2

Byłoby to bardzo pomocne, jeśli można to małą próbkę danych, a także dokładnie to, czego oczekują, że dane wyglądają tak, jakby zostały zgrupowane. – diceguyd30

+0

@ diceguyd30! Zaktualizowałem pytanie: – IsmailS

+0

Dlaczego dwa dolne wiersze (z nazwą klienta "Abc" i DateTime of Today) nie znajdują się na tej samej liście co inne złożone przez klientów "Abc" złożone dzisiaj? –

Odpowiedz

5

Oto jedna możliwa odpowiedź LINQ, choć jestem pewien, że bardziej wydajny taki istnieje:

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 Dziękuję bardzo. Opuszczając teraz dom. Spróbuję jutro. – IsmailS

+0

Jesteś świetny! Działa zadziwiająco !!! Uratowałeś mi wiele bólu głowy i czasu. Jestem ci wdzięczny. – IsmailS

+0

Nie ma problemu! Cieszę się, że to działało! – diceguyd30