0

多くのブロックを含むリストがあり、ブロックはクラス「Block」のプロパティ「IsOld」を使用して古いものと新しいものに分けられます。今、私はこのように古いものを抽出します:

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

'olds'リストのアイテムのプロパティのいくつかの値を変更した後、元のリスト'blocks'の対応するプロパティは変更されません。そして、私はそれに対処する方法がわかりません。つまり、List.Whereメソッドを使用すると、すべてのアイテムのディープコピーが作成されますか?


「ブロック」は構造体で、最初はクラスだと思いました。
不注意でご迷惑をおかけして申し訳ありませんo(︶︿︶)o

4

4 に答える 4

2

プロパティの値を変更しているのであって、オブジェクト自体を置き換えているのではないと言っています。したがって、ブロックリストの元のオブジェクトも更新する必要があります。つまり、ブロックがクラスタイプとして定義されている場合です。ブロックが構造体の場合、すべての割り当ては元のオブジェクトのコピーで行われるため、古いリストでの変更は元のブロックリストに反映されません。

ブロックは構造体ですか?

于 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

ブロックは構造体であるため、次のように実行できます。

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 に答える