#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);
}