如何使用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
相关产品推荐
相关产品推荐

