我有一个列表包含许多块,并且块分为旧的和新的,使用类'Block'中的属性'IsOld'来指定它们。现在我像这样提取旧的:
List<Block> olds = blocks.Where(item => {return item.IsOld;}).ToList();
在我更改“olds”列表中项目的某些属性值后,原始列表“blocks”中的相应值不会更改。我不知道如何处理它。这意味着如果我使用List.Where方法,它会为每个项目制作一个深层副本吗?
'Block'是一个结构,我首先认为它是一个类 很抱歉因为我的粗心o()︿)而烦恼你。
答案 0 :(得分:2)
您说您正在更改属性的值,而不是替换对象本身。因此,块列表中的原始对象也应该更新,即如果Block被定义为类类型。如果Block是一个struct,那么每个赋值都是在原始对象的副本中完成的,那么olds列表中的更改不应该反映在原始块列表中。
阻止结构吗?
答案 1 :(得分:2)
如果您想更改“旧”项目的属性,为什么不这样做:
blocks.ForEach(item =>
{
if (item.IsOld)
{
// Do your changes here ...
}
});
答案 2 :(得分:1)
而不是你在做什么,试试这个:
blocks.ForEach(item => { if(item.IsOld){/*perform change here*/} });
此外,如果您想查看出错的地方,请将代码粘贴到您要更改的位置,这样会更清楚
答案 3 :(得分:0)
由于block是一个结构,你可以这样做:
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();