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

如何使用with关键字修改C#嵌套record的简单属性及集合属性值?

结论

可以通过组合嵌套with表达式 + 集合投影操作实现需求,这是当前场景下无额外依赖的最高效原生实现方式。C#的with本身只支持浅拷贝,搭配逐层构造新实例的写法既能保持record的不可变特性,也不会产生多余的性能开销。

实现逻辑

  • 嵌套简单属性修改:逐层对上层record使用with生成新实例,替换目标属性即可
  • 集合内部属性修改:对原集合做投影遍历,仅对需要修改的元素用with生成新实例,其余元素保留原引用,最终生成新的集合赋值到对应属性

示例代码

class Program
{
    static void Main(string[] args)
    {
        var company = new Company(
            Name: "Company1",
            Branch: new Branch(
                Location: "Krakow",
                Employees: new[]
                {
                    new Employee("Robert")
                }));

        // 生成修改后的新实例
        var updatedCompany = company with
        {
            Branch = company.Branch with
            {
                // 修改嵌套的简单属性Location
                Location = "Warsaw",
                // 修改集合内的Employee属性
                Employees = company.Branch.Employees
                    .Select(emp => emp.FirstName == "Robert" 
                        ? emp with { FirstName = "Bob" } 
                        : emp)
                    // 可以根据需求保留IEnumerable类型或者转成数组/列表
                    .ToArray()
            }
        };

        Console.WriteLine("原实例:");
        Console.WriteLine(company);
        Console.WriteLine("\n修改后的新实例:");
        Console.WriteLine(updatedCompany);
    }
}

internal record Company(string Name, Branch Branch);
internal record Branch(string Location, IEnumerable<Employee> Employees);
internal record Employee(string FirstName);

补充说明

如果实际业务中嵌套层级超过3层,可以写通用扩展方法封装嵌套更新逻辑,减少重复的多层with代码;如果是高频修改的场景,也可以提前做集合类型的适配,避免频繁的枚举转换开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:45:00