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

时间:2012-09-07 05:51:24

标签: c# .net linq

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

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

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


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

4 个答案:

答案 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();