首页 > 解决方案 > C# 9.0 记录可以支持字典和列表等数据结构吗?

问题描述

我已经看到了 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" })
};

标签: c#.netdata-structuresimmutability

解决方案


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

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

var newCar = car with
{
    Riders = new Dictionary<string, Person> { { "passenger1", new Person { Name = "Marty McFly" } } }
};

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

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

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


推荐阅读