c#当我使用list处理从原始列表中提取的列表时,我如何更改原始列表的值.哪里



我有一个包含许多块的列表,这些块被分为旧块和新块,使用类"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();

最新更新