0

我有一个包含许多块的列表,块分为旧块和新块,使用“块”类中的属性“IsOld”来指定它们。现在我像这样提取旧的:

List<Block> olds = blocks.Where(item => {return item.IsOld;}).ToList();

在我更改“olds”列表中项目的某些属性值后,原始列表“blocks”中的相应值不会改变。我不知道如何处理它。这意味着如果我使用 List.Where 方法,它会为每个项目制作一个深层副本?


'Block' 是一个结构,我首先认为它是一个类。
很抱歉因为我的粗心给你添麻烦了o(︶︿︶)o

4

4 回答 4

2

您是说您正在更改properties的值,而不是替换对象本身。因此,块列表中的原始对象也应该更新,即如果块被定义为类类型。如果 Block 是一个结构,那么每个分配都是在原始对象的副本中完成的,那么您在 olds 列表中的更改不应反映在原始块列表中。

块是结构吗?

于 2012-09-07T05:56:44.033 回答
2

如果您想更改“旧”项目的属性,为什么不这样做:

blocks.ForEach(item => 
{
    if (item.IsOld)
    {
        // Do your changes here ...
    }
});
于 2012-09-07T06:00:15.450 回答
1

而不是你在做什么,试试这个:

blocks.ForEach(item => { if(item.IsOld){/*perform change here*/} });

另外,如果您想查看哪里出错了,请将您的代码粘贴到您要更改的地方,这样会更清楚

于 2012-09-07T05:57:43.407 回答
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();
于 2012-09-07T06:26:43.753 回答