C# Linq实现列表合并:字符串列表与类列表一对一匹配
字符串列表与类列表的合并实现
问题分析
需要基于字符串列表生成对应的FooClass列表,每个字符串对应一个FooClass实例:
- 实例的
Code字段为字符串列表中的元素 - 如果
FooClasses列表中存在Code匹配的元素,就使用其Description - 无匹配时
Description设为null
原代码的问题
- 接口实例化错误:
IEnumerable<T>是接口,不能直接用new IEnumerable<FooClass>()创建实例 - ForEach误用:
List<T>.ForEach是void方法,无法链式调用后续的Select - 查找逻辑错误:
Contains不支持lambda参数,应该用Any判断是否存在匹配- 仅判断存在性无法获取对应的
Description,需要用FirstOrDefault拿到匹配对象 - 条件判断里用了赋值运算符
=,应该用相等运算符==
- 语法错误:对象初始化器括号不闭合、语句缺少分号
正确实现代码
namespace TestListMerge { public class FooClass { public string Code { get; set; } public string? Description { get; set; } } public class ProcessLists { private readonly List<string> _fooCodes = new List<string>() { "1", "2", "3", "4" }; private readonly List<FooClass> _fooClasses = new List<FooClass>() { new FooClass { Code = "5" , Description = "Desc 5" }, new FooClass { Code = "2" , Description = "Desc 2" }, new FooClass { Code = "3" , Description = "Desc 3" } }; public IEnumerable<FooClass> MergeLists() { // 转成字典优化查找效率,避免多次遍历列表 var codeDescMap = _fooClasses.ToDictionary(fc => fc.Code, fc => fc.Description); return _fooCodes.Select(code => new FooClass { Code = code, Description = codeDescMap.TryGetValue(code, out var desc) ? desc : null }); } } } // 调用示例 var processor = new ProcessLists(); var combinedList = processor.MergeLists();
实现说明
- 字典优化:将
_fooClasses转换为以Code为键、Description为值的字典,把每次查找的时间复杂度从O(n)降到O(1),列表元素越多性能提升越明显 - Select映射:遍历
_fooCodes中的每个字符串,创建对应的FooClass实例:Code直接赋值为当前字符串- 用
TryGetValue尝试从字典中获取匹配的描述,存在则赋值,否则设为null
- 编码规范:将原字段改为私有只读字段(
_fooCodes、_fooClasses),符合C#的代码命名规范
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

