Изменение значения свойства во вложенных записях

#c# #.net #c#-9.0

Вопрос:

Можно ли использовать with ключевое слово для создания нового экземпляра вложенных записей с другим значением для вложенного свойства — в обоих случаях: простое свойство и коллекция? Давайте рассмотрим пример:

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

        Console.WriteLine(company);
    }
}

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

В приведенном выше примере я хочу создать новую запись, но с измененными значениями местоположения филиала ( "Krakow" ) и имени сотрудника ( "Robert" ). Как я могу сделать это наиболее эффективно?

Комментарии:

1. var x = company with { Branch = company.Branch with { Location = "..." , Employees = company.Branch.Employees.Append("...").ToArray() } . Используйте ImmutableList<T> / ImmutableArray<T> вместо IEnumerable<T> там, чтобы позволить вам сделать Employees = company.Branch.Employees.Add("...")

2. Вам нужно создать новый экземпляр всех записей. Вам понадобится with внутри with

Ответ №1:

Вы можете вложить свои with выражения:

 var clone = company with {
    Name = "Company2",
    Branch = company.Branch with {
        Location = "Warshaw",
        Employees = new[]
        {
            company.Branch.Employees.First() with 
            {
                FirstName = "Bob"
            }
        }}};

Console.WriteLine(clone);
foreach (var e in clone.Branch.Employees)
{
    Console.WriteLine(e);
}