在C#中按元素位置自定义合并同类型等长列表
按对应位置合并两个等长同类型List集合
嘿,针对你这个需求,我们可以用LINQ的Zip方法快速实现按对应位置两两合并的操作,再结合自定义的合并逻辑就能得到你想要的结果。下面是具体的实现步骤和代码:
完整代码示例
public class classA { public classA() { } public int id { get; set; } public string email { get; set; } public string name { get; set; } } // 初始化你的两个集合 var users1 = new List<classA> { new classA{ id= 1, email = "Test1@Test.com" }, new classA{ id= 2, email = "Test2@Test.com" } }; var users2 = new List<classA> { new classA{ id= 456, email = "Test1@Test.com", name = "Test One" }, new classA{ id= 123, email = "Test2@Test.com", name = "Test Two" } }; // 核心合并逻辑:按对应位置配对并自定义合并规则 var mergedUsers = users1.Zip(users2, (u1, u2) => new classA { id = u1.id, // 保留users1的id email = u1.email, // 保留users1的email(这里两个集合的email一致,取哪个都可以) name = u2.name // 提取users2的name }).ToList();
代码解释
Zip方法的作用:这是LINQ专门为等长序列设计的配对工具,它会依次取两个集合中索引相同的元素,把每一对元素传入你定义的合并逻辑里,最终生成一个新的序列。- 自定义合并规则:这里根据你的期望结果,我们明确了合并规则——从
users1拿id和email,从users2拿name。如果之后你的合并规则有变化,直接修改这部分逻辑就行。 - 适配性:因为你已经明确两个集合是同类型、等长的,所以
Zip会完美匹配每一对元素,不会出现遗漏或多余的情况。
更灵活的自定义合并函数
如果你的合并逻辑比较复杂,或者之后需要复用这个逻辑,可以把合并规则抽成一个单独的方法:
// 抽离的自定义合并函数 private static classA MergeClassA(classA userFromList1, classA userFromList2) { return new classA { id = userFromList1.id, email = userFromList1.email, name = userFromList2.name // 后续可以在这里扩展更多合并规则,比如处理空值、合并其他字段等 }; } // 使用自定义函数完成合并 var mergedUsers = users1.Zip(users2, MergeClassA).ToList();
运行上面的代码后,mergedUsers就会完全符合你期望的结果:
{ { id=1, email="Test1@Test.com", name="Test One" }, { id=2, email="Test2@Test.com", name="Test Two" } }
内容的提问来源于stack exchange,提问作者Ankit Giri
相关产品推荐
相关产品推荐

