我正在阅读MSDN上的"with"表达式,并决定对其中提供的示例代码稍加修改.在创建var copy时,我如何附加标签列表,而不必像我在这里(new List<string> { "A", "B", "C"})那样显式写出三个标签?我试过Tags = original.Tags + "C",但那当然不行.

using System;
using System.Globalization;
using System.Threading.Tasks;

namespace AsyncBreakfast
{
    public class ExampleWithReferenceType
    {
        public record TaggedNumber(int Number, List<string> Tags)
        {
            public string PrintTags() => string.Join(", ", Tags);
        }

        public static void Main()
        {
            var original = new TaggedNumber(1, new List<string> { "A", "B" });

            var copy = original with { Tags = new List<string> { "A", "B", "C"} };
            Console.WriteLine($"Tags of {nameof(copy)}: {copy.PrintTags()}");
            // output: Tags of copy: A, B, C

            original.Tags.Add("C");
            Console.WriteLine($"Tags of {nameof(copy)}: {copy.PrintTags()}");
            // output: Tags of copy: A, B, C

        }
    }
}

推荐答案

通过执行以下操作,可以创建一个包含额外元素的列表副本:

with { Tags = original.Tags.Append("C").ToList() }

然而,如果您希望记录是不可变的(如果您遵循通过创建副本进行修改的方法,那么您可能应该这样做),那么您可能根本不想使用List<T>,因为List<T>是可变的.

相反,您可以使用ImmutableList<T>.这有一个Add方法,它返回一个包含指定元素的新ImmutableList<T>,这意味着您可以编写:

with { Tags = original.Tags.Add("C") }

Csharp相关问答推荐

将修剪声明放入LINQ中

获取ASP.NET核心身份认证cookie名称

WPF DataGrid中的三维数据

.NET 8 Web-API返回空列表

需要在重新启动ApplicartionPool或IIS后启动/唤醒API的帮助

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

Blazorise折线图仅绘制数据集的一部分

如何使用NumberFormatInfo

TeamsBot SendActivityActivityTypes与ActivityTypes同步.键入不再起作用

.NET并发词典交换值

VS 2022与VS 2019:如何/为什么创建额外的任务?

MudBlazor Textfield已禁用,但其验证工作正常

获取混淆&Quot;模糊引用&Quot;错误

ASP.NET MVC数据批注验证组复选框

为什么在使用JsonDerivedType序列化泛型时缺少$type?

WPF:如何从DatagridHeader的内容模板绑定到词典项

Xamarin Forms应用程序中登录页面的用户名和密码编辑文本之间不需要的空格

处理方法内部过滤与外部过滤

这是T自身的布尔表达式是什么意思?

Windows 10上埃及标准时间的时区偏移不正确