如何使用LINQ基于ID合并两个不同的对象列表?
问题描述
我有两个各包含数千条记录的对象列表,简化示例如下:
LIST A [ {"001","James","London","Accountant"}, {"002","Laura","New York","Marketing"}, {"003","Zack","Austin","Support"}, {"004","Maggie","Phoenix","DevOps"} ] LIST B [ {"002","09/10/2021"}, {"004","11/24/2009"} ]
希望通过LINQ查询,基于ID(第一个字段)合并两个列表,得到如下结果:
LIST RESULT [ {"002","Laura","New York","Marketing","09/10/2021"}, {"004","Maggie","Phoenix","DevOps","11/24/2009"} ]
我尝试的代码未得到预期结果:
var Result = A.Where(p => B.All(p2 => p2.Id == p.Id)).ToList();
解决方案
你当前的代码逻辑错误:B.All(p2 => p2.Id == p.Id)是判断B中所有元素的Id都等于当前A元素的Id,只有当B里所有记录的Id完全一致时才会匹配,这显然不符合你的需求。
正确的做法是使用LINQ的Join方法实现内连接,匹配两个列表中Id相同的元素,再合并字段:
假设你的对象类定义如下(如果是匿名类或动态类型,逻辑一致):
public class Employee { public string Id { get; set; } public string Name { get; set; } public string City { get; set; } public string Position { get; set; } } public class DateRecord { public string Id { get; set; } public string Date { get; set; } }
对应的LINQ查询代码:
var result = A.Join( B, employee => employee.Id, // A的匹配键 record => record.Id, // B的匹配键 (employee, record) => new // 合并成新对象 { employee.Id, employee.Name, employee.City, employee.Position, record.Date }).ToList();
这段代码会将A和B中Id相同的元素配对,合并后得到你需要的结果列表。如果需要强类型对象,可以将匿名类替换为自定义的结果类。
内容的提问来源于stack exchange,提问作者HeimWinz
相关产品推荐
相关产品推荐

