views:

67

answers:

1

I want to achieve something similar to this. But I don't know in what manner I can use that solution.

My entity has these properties

CustomerName
Date
SortOrder

I've whole list of this Entity. What I want to do is, group all those items in List<> which have consecutive SortOrder and same Date and same CustomerName

Example input

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

Example output

  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
Non-LINQ solution will also suffice.

+1  A: 

Here's one possible LINQ answer, though I'm sure a more efficient one exists:

    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))
        )
diceguyd30
+1 Thanks very much. Leaving for home right now. Will try it tomorrow.
Ismail
You are great! It works amazingly!!! You saved me lot of headache and time. I'm grateful to you.
Ismail
No problem! Glad it worked!
diceguyd30