2010-10-26 30 views
5

Quiero lograr algo similar a this. Pero no sé de qué manera puedo usar esa solución.¿Dividir una colección en partes según la condición con LINQ?

Mi entidad tiene estas propiedades

CustomerName 
Date 
SortOrder 

He lista entera de esta Entidad. Lo que quiero hacer es, agrupar todos esos elementos en la lista <> que tienen consecutiva SortOrder y la misma Fecha y la misma CustomerName

Ejemplo de entrada

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

Ejemplo de salida

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} 

     } 
    }; 

ACTUALIZACIÓN
Solución no LINQ también será suficiente.

+2

Sería de gran ayuda si usted podría incluir una pequeña muestra de los datos, así como exactamente lo que espera que los datos de parece una vez que se ha agrupado. – diceguyd30

+0

@ diceguyd30! He actualizado la pregunta – IsmailS

+0

¿Por qué las dos filas inferiores (con CustomerName "Abc" y DateTime of Today) no están en la misma lista que los otros pedidos de clientes "Abc" realizados hoy? –

Respuesta

5

He aquí una posible respuesta LINQ, aunque estoy seguro que existe uno más eficiente:

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 Muchas gracias. Dejando para casa en este momento. Lo intentaré mañana. – IsmailS

+0

¡Eres genial! ¡Funciona increíblemente! Me salvaste mucho dolor de cabeza y tiempo. Te estoy agradecido – IsmailS

+0

¡Ningún problema! Me alegro de que funcionó! – diceguyd30

Cuestiones relacionadas