在C#中更新List中结构的属性

Nib*_*Pig 5 c# struct

我有一个List<Cat>地方Catstruct有一个ID和一个名称.

如何更改ID为7的猫的名称?

我做了(没想到)

var myCat = catList.Single(c => c.Id == 7);

mycat.Name = "Dr Fluffykins";
Run Code Online (Sandbox Code Playgroud)

但当然,结构是价值类型.那么是否可以使用这样的技术,或者我是否必须更改.Singlefor循环并存储索引以使用更新的结构替换它?

das*_*ght 2

由于structs 是值类型,并且由于值类型会被复制,myCat因此最终会得到列表中 cat 的副本。您需要对其struct本身进行操作,而不是对其副本进行操作。

struct此外,只有当 s 的字段是单个变量或数组的一部分时,才可以直接修改它们。List<T>的索引器返回一个副本,因此 C# 编译器会生成“无法修改值类型”错误。

我知道的唯一解决方案(缺少创建Catclass重新分配修改后的副本)是创建catList一个数组:

var indexOf = catArray
    .Select((Cat, Index) => new {Cat, Index})
    .Single(p => p.Cat.Id == 7).Index;
catArray[indexOf].Name = "Dr Fluffykins";
Run Code Online (Sandbox Code Playgroud)