C# 9.0 记录可以支持字典和列表等数据结构吗?

ros*_*res 6 .net c# immutability data-structures

我见过 C# 9.0 中新记录功能的几个示例。即,能够更新各个属性以创建新的不可变记录。我很想知道with语法是否允许我将新条目插入到字典之类的东西中,创建一个新的不可变字典以及构成记录的所有同级属性。

例如,我可以做这样的事情吗?

public record Person
{
    public string Name;
}
 
public record Car
{
    public string Model;
    public Dictionary<string, Person> Riders;
}

var car = new Car 
{
    Model = "Delorean",
    Riders = ("driver", new Person { Name = "Doc Brown" })
};

var newCar = car with
{ 
    Riders with ("passenger1", new Person { Name = "Marty McFly" })
};
Run Code Online (Sandbox Code Playgroud)

Pet*_*iho 3

正如此评论中所述,您肯定不能执行此操作,因为with仅适用于记录类型。但无论如何,也不完全清楚你的意思。该类Dictionary<TKey, TValue>一开始就不是一成不变的,因此with似乎没有必要。您期望上面建议的语法做什么?

如果您的意思是它替换字典内容,您可以使用当前with语法轻松地做到这一点:

var newCar = car with
{
    Riders = new Dictionary<string, Person> { { "passenger1", new Person { Name = "Marty McFly" } } }
};
Run Code Online (Sandbox Code Playgroud)

如果您打算添加到现有的字典内容,但使用一个新实例,这不太优雅,但仍然很容易,并且对我来说几乎一样好:

var newCar2 = car with
{
    Riders = new Dictionary<string, Person>(car.Riders)
    {
        { "passenger1", new Person { Name = "Marty McFly" } }
    }
};
Run Code Online (Sandbox Code Playgroud)

你希望有一些东西可以避免这个new Dictionary...部分吗?我认为在当前版本的 C# 中这是不可能的,即使在过去几个版本中为支持集合初始值设定项而进行了所有增强。