LCJ
LCJ

Reputation: 22661

Object Type conversion while doing Group By

I have a List. I need to find the unique ExistingData records by applying Group By. Following code works.

 var distinctItemsWorking = myCostPages
        .GroupBy(x => new { 
                             x.CostPageContent.Program, 
                             x.CostPageContent.Group, 
                             x.CostPageContent.Sequence })
        .Select(y => y.First());

Now I need to convert the unique list into a List. How can we achieve this conversion when we do Grouping?

C# Method

    public List<CostPage> GetCostPages(SearchEntity search, int pageIndex, int pageSize)
    {
        List<ExistingData> AllData = GetExistingData();

        var allMatchingValues = from existingDatas in AllData
                                where existingDatas.CostPageContent.Program == search.Program
                                select existingDatas;


        var query = allMatchingValues;
        List<ExistingData> currentSelectionForExistingData = query
            .Skip(pageIndex * pageSize)
            .Take(pageSize)
            .ToList();


        //var distinctItems = currentSelectionForExistingData.GroupBy(x => new { x.CostPageContent.Program, x.CostPageContent.Group, x.CostPageContent.Sequence })
        //                    .Select(y => new CostPage()
        //                    {
        //                        CostPageContent = y.CostPageContent 
        //                    }
        //                    );

        var distinctItemsWorking = currentSelectionForExistingData.GroupBy(x => new { x.CostPageContent.Program, x.CostPageContent.Group, x.CostPageContent.Sequence })
                           .Select(y => y.First());

        List<CostPage> myCostPages = new List<CostPage>();
        foreach (ExistingData exist in distinctItemsWorking)
        {
            CostPage c = new CostPage();
            c.CostPageContent = exist.CostPageContent;
            myCostPages.Add(c);
        }

        return myCostPages;
    }

Other Classes

public class ExistingData
{
    public CostPageNumberContent CostPageContent { get; set; }
    public string ItemID { get; set; }
}

public class CostPage
{
    public CostPageNumberContent CostPageContent { get; set; }
}


public class CostPageNumberContent
{
    public string Program { get; set; }
    public string Group { get; set; }
    public string Sequence { get; set; }
}

public class SearchEntity
{
    public string Program { get; set; }
    public string Sequence { get; set; }
    public string ItemID { get; set; }
}

Upvotes: 0

Views: 88

Answers (1)

Daniel Hilgarth
Daniel Hilgarth

Reputation: 174417

If you are trying to replace the foreach, you can do something like this:

var myCostPages = currentSelectionForExistingData
    .GroupBy(x => new { x.CostPageContent.Program, x.CostPageContent.Group, 
                        x.CostPageContent.Sequence })
    .Select(y => new CostPage { CostPageContent = y.First().CostPageContent })
    .ToList();

Putting the creation of the CostPage objects into GroupBy would make no sense. The Select is the correct place to perform this conversion.

Upvotes: 2

Related Questions