如何从现有列表中创建一个新列表,该列表中的元素在Linq to对象中包含相同的id

本文关键字:列表 Linq 元素 to id 包含相 对象 一个 创建 新列表 | 更新日期: 2023-09-27 18:24:17

我有一个列表:

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

我想将顶部列表转换为新列表:

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

如何从现有列表中创建一个新列表,该列表中的元素在Linq to对象中包含相同的id

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();

像这样的东西应该可以做到:

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();

这确实假设RefName/RefId总是一致的。