Search code examples
c#linqlistgroup-byusing

Using LINQ to construct a list C#


 ProductCategory = "A"
 Public Class ProdCat
 {
     public   int productId,
     public string  productCategory
}

I have a list like this

List<ProdCat> ProdCatList = new List<ProdCat>();
ProdCatList.Add( new ProdCat{ productId= 1, productCategory= "A" } );
ProdCatList.Add( new ProdCat{ productId= 2, productCategory= "B" } );
ProdCatList.Add( new ProdCat{ productId= 3, productCategory= "A" } );
ProdCatList.Add( new ProdCat{ productId= 4, productCategory= "C" } );
ProdCatList.Add( new ProdCat{ productId= 5, productCategory = "A" } );
ProdCatList.Add( new ProdCat{ productId = 6, productCategory= "B" } );

I need to come up with a list like this. Please note ProductCatList is a list and it has two properties, Namely Product Category which is a sting and productIds which is another list in ProductCatList

ProductCatList
     ProductCategory = "A"
         productId = 1
         productId = 3
         productId = 5
   ProductCategory = "B"
         productId = 2
         productId = 6
   ProductCategory = "C"
         productId = 4

Class Implementation would be like below

Public Class ProductCatGroup
{
   string      ProductCategory ,
   IList <int> ProdcutId 

}

How can i achieve something like above using LINQ


I have two classes as below

 public class product
            {
    
                public int productId { get; set; }
                public string productName { get; set; }
            }
    
            public class ProductCat
            {
    
    
                public int productId { get; set; }
                public string productName { get; set; }
                public int productCatId { get; set; }
                public string ProductCatName { get; set; }
            }
    

The list is as below

   List<ProdCat> ProdCatList = new List<ProdCat>();
    ProdCatList.Add( new ProdCat{ productId= 1, productCatId = "1", productName="PA", ProductCatName = "PC1"});
    ProdCatList.Add( new ProdCat{ productId= 2, productCatId = "2", productName="PB", ProductCatName = "PC2"});
    ProdCatList.Add( new ProdCat{ productId= 3, productCatId = "2", productName="PC", ProductCatName = "PC2"});
    ProdCatList.Add( new ProdCat{ productId= 4, productCatId = "1", productName="PD", ProductCatName = "PC1"});
    ProdCatList.Add( new ProdCat{ productId= 5, productCatId = "1", productName="PE", ProductCatName = "PC1"});

And I need to come up with something like below

 ProductCatGroup
      productCatId = "1"
      ProductCatName = "PC1"
           productId = 1
           productName = "PA"
           productId = 4
           productName = "PD"
           productId = 5
           productName = "PE"
      productCatId = "2"
      ProductCatName = "PC2"
             productId = 2
             productName = "PB"
             productId = 3
             productName = "PC"

Class implementation is as below

public class ProductCatGroup
{
           public int productCatId { get; set; }
            public int productCatName{ get; set; }
            public IList<Product> ProductList = new List<Product>();

}

I think this is much clear now


Solution

  • var grouped = ProductCatList.GroupBy(g => new{g.productCatId,g.productCatName})
                         .Select(g => new ProductCatGroup()
                                      {
                                          productCatId = g.Key.productCatId,
                                          productCatName = g.Key.productCatName,
                                          ProductList = g.Select(p => new Prroduct()
                                                        {
                                                             productid = p.productId,
                                                             productName = p.productName
                                                         }
                                      });