Hau Le
Hau Le

Reputation: 677

How to creat a new list from existing list with elements which contains the same id in Linq to object?

I have a list:

var list = new List<Test>{
   new Test = {
        ID = 1,
        Name = "Test 1",
        RefId = 1
        RefName = "Test RefName 1"
   },
   new Test = {
        ID = 2,
        Name = "Test 2",
        RefId = 1
        RefName = "Test RefName 1"
   },
   new Test = {
        ID = 3,
        Name = "Test 3",
        RefId = 2
        RefName = "Test RefName 2"
   },
   new Test = {
        ID = 4,
        Name = "Test 4",
        RefId = 2
        RefName = "Test RefName 2"
   }
};

And I want to convert the top list into the new list:

var list = new List<TestNew>{
    new TestNew = {
       RefId = 1,
       RefName = "Test RefName 1",
       ListGroup = new List<Group>{
          new Group{
             ID = 1,
             Name = "Test 1"
          },
          new Group{
             ID = 2,
             Name = "Test 2"
          },
       }
    },
   new TestNew = {
       RefId = 2,
       RefName = "Test RefName 2",
       ListGroup = new List<Group>{
          new Group{
             ID = 3,
             Name = "Test 3"
          },
          new Group{
             ID = 4,
             Name = "Test 4"
          },
       }
    }
};

Upvotes: 0

Views: 413

Answers (2)

Rhys Bevilaqua
Rhys Bevilaqua

Reputation: 2167

Something like this should do the trick:

list.GroupBy(item => item.RefId)
    .Select(grouping => new ListNew() {
           RefId = grouping.Key,
           RefName = grouping.First().RefName,
           ListGroup = grouping.Select(i => new Group() { ID = i.ID, Name = i.Name }).ToList()
     })
     .ToList();

This does assume that the RefName/RefId are always consistant.

Upvotes: 1

cuongle
cuongle

Reputation: 75306

list.GroupBy(x => new { x.RefId, x.RefName })
    .Select(g => new TestNew() {
        RefId = g.Key.RefId,
        RefName = g.Key.RefName,
        ListGroup = g.Select(y => new Group() {
            ID = y.ID,
            Name = y.Name
        }).ToList()
    }).ToList();

Upvotes: 2

Related Questions