You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Linq实现列表合并:字符串列表与类列表一对一匹配

字符串列表与类列表的合并实现

问题分析

需要基于字符串列表生成对应的FooClass列表,每个字符串对应一个FooClass实例:

  • 实例的Code字段为字符串列表中的元素
  • 如果FooClasses列表中存在Code匹配的元素,就使用其Description
  • 无匹配时Description设为null

原代码的问题

  1. 接口实例化错误:IEnumerable<T>是接口,不能直接用new IEnumerable<FooClass>()创建实例
  2. ForEach误用:List<T>.ForEach是void方法,无法链式调用后续的Select
  3. 查找逻辑错误:
    • Contains不支持lambda参数,应该用Any判断是否存在匹配
    • 仅判断存在性无法获取对应的Description,需要用FirstOrDefault拿到匹配对象
    • 条件判断里用了赋值运算符=,应该用相等运算符==
  4. 语法错误:对象初始化器括号不闭合、语句缺少分号

正确实现代码

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

实现说明

  1. 字典优化:将_fooClasses转换为以Code为键、Description为值的字典,把每次查找的时间复杂度从O(n)降到O(1),列表元素越多性能提升越明显
  2. Select映射:遍历_fooCodes中的每个字符串,创建对应的FooClass实例:
    • Code直接赋值为当前字符串
    • 用TryGetValue尝试从字典中获取匹配的描述,存在则赋值,否则设为null
  3. 编码规范:将原字段改为私有只读字段(_fooCodes、_fooClasses),符合C#的代码命名规范

内容的提问来源于stack exchange,提问作者Bill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:17:07