如何使用LINQ将两个不同结构的列表连接合并为指定结构的新列表
实现方案
第一步:修正类定义语法错误
你提供的result类存在语法错误,修正后完整类定义如下:
public class list1 { public string ID { get; set; } } public class list2 { public string ID { get; set; } public string Member { get; set; } } public class result { public string ID { get; set; } public List<list2> list2s { get; set; } }
第二步:LINQ关联合并实现
以下两种实现方式均可满足需求,默认保留list1的所有元素,即使list2无对应匹配项也会生成list2s为空集合的result对象:
方式1:方法语法(GroupJoin)
直接调用LINQ原生GroupJoin方法实现关联分组:
// 模拟输入数据 List<list1> list1Data = new List<list1> { new list1 { ID = "a" }, new list1 { ID = "b" }, new list1 { ID = "c" }, new list1 { ID = "d" } }; List<list2> list2Data = new List<list2> { new list2 { ID = "a", Member = "1" }, new list2 { ID = "a", Member = "2" }, new list2 { ID = "a", Member = "3" }, new list2 { ID = "b", Member = "1" }, new list2 { ID = "b", Member = "2" }, new list2 { ID = "c", Member = "1" }, new list2 { ID = "d", Member = "1" } }; // 核心关联逻辑 List<result> resultData = list1Data .GroupJoin( list2Data, l1 => l1.ID, l2 => l2.ID, (l1, l2Group) => new result { ID = l1.ID, list2s = l2Group.ToList() }) .ToList();
方式2:查询语法
可读性更高的LINQ查询写法,逻辑和GroupJoin完全等价:
List<result> resultData = ( from l1 in list1Data join l2 in list2Data on l1.ID equals l2.ID into l2Group select new result { ID = l1.ID, list2s = l2Group.ToList() }).ToList();
结果验证
最终生成的resultData完全匹配期望结构:
- ID为
a的元素对应list2s包含Member为1、2、3的3个list2对象 - ID为
b的元素对应list2s包含Member为1、2的2个list2对象 - ID为
c的元素对应list2s包含Member为1的1个list2对象 - ID为
d的元素对应list2s包含Member为1的1个list2对象
内容的提问来源于stack exchange,提问作者softly21
相关产品推荐
相关产品推荐

