我有一个包含许多块的列表,这些块被分为旧块和新块,使用类"Block"中的属性"IsOld"来指定它们。现在我提取旧的如下:
List<Block> olds = blocks.Where(item => {return item.IsOld;}).ToList();
在我更改"旧"列表中项目的某些属性值后,原始列表"块"中相应的值不会更改。我不知道如何处理它。这意味着如果我使用List。在哪里方法,它会为每个项目做一个深度复制?
"Block"是一个结构,我最初以为它是一个类
很抱歉因为我的疏忽而打扰你
您的意思是更改属性的值,而不是替换对象本身。因此,块列表中的原始对象也应该更新,也就是说,如果块被定义为类类型。如果Block是一个结构,那么每个赋值都是在原始对象的副本中完成的,那么您在旧列表中的更改不应反映在原始块列表中。
Block是结构体吗?
如果您想更改"旧"项目的属性,为什么不直接更改呢:
blocks.ForEach(item =>
{
if (item.IsOld)
{
// Do your changes here ...
}
});
不要做你正在做的事情,试试这个:
blocks.ForEach(item => { if(item.IsOld){/*perform change here*/} });
此外,如果你想看看哪里出了问题,把你的代码粘贴到你正在更改的地方,会更清楚
由于块是一个结构,您可以这样做:
List<Block> updatedBlocks = blocks
.Select(item => item.IsOld ? new Block { X=item.X, Y=item.Y, Z=updatedZ } : item)
.ToList();
更容易理解的是,定义一种方法
private Block UpdateBlock(Block sourceValue)
{
if (!sourceValue.IsOld)
return sourceValue;
var result = new Block // ...
// populate result here...
return result;
}
然后这样称呼它:
List<Block> updatedBlocks = blocks.Select(UpdateBlock).ToList();