2012-01-07 16 views
3

オブジェクトのリストがあり、リスト上でforeachを実行しています。オブジェクトを変更して返すメソッドに各オブジェクトを送ります。次のようになります:オブジェクトが変更された後にリスト内のオブジェクトを更新する

これは機能しません。私がやりたいことは、反復処理中のオブジェクトを、MyMethodによって返される変更されたバージョンに置き換えることです。

変更する必要があるのは何ですか?

ありがとうございました。

+0

の可能重複[なぜC#のforeach文の読み取り専用で反復変数はあります?] (http://stackoverflow.com/questions/776430/why-is-the-iteration-variable-in-ac-sharp-foreach-statement-read-only) –

答えて

3

ループ変数に再割り当てすることはできません。変数を再割り当てしても、リスト内のオブジェクトには何の影響もありません。オブジェクトをリストに書き込む必要がある場合は、forループを使用します。

for (int index = 0; index < list.Count; index++) 
{ 
    var obj = list[index]; 
    list[index] = MyMethod(obj); 
} 
+0

ああ!!!!!!!!はい、ありがとう。 – frenchie

+0

このスレッドでは、最初に試したやり方で 'for..each'ループを使用できない理由を説明します。http://stackoverflow.com/questions/5650705/in-c-why-cant-i-modify-the -emember-of-a-value-type-fore-a-foreach-loop – keyboardP

+0

そして、リストからobjを削除したいのですが? – frenchie

2

このようにすることはできません。 C#では、foreachの反復変数を変更することはできません。あなたの最善の選択肢は、セカンダリリストを保持し、そこに変更された値を入れて、最初のリストを置き換えることです。また、データ構造で直接インデックス作成が可能な場合は、foreachforに置き換えることができます。オブジェクトを直接割り当てることができます。

0

MyObjectModelがクラス(構造体ではない)であるなら、あなたはそれを再割り当てする必要はありません。クラスは参照型です。これは、メソッドがコレクション内のオブジェクトへのポインタを取得することを意味します。メソッドで行った変更は、リスト内の実際のオブジェクトに対して行われます。あなたはそれを交換する必要はありません。

あなたが戻ってきた全く新しいオブジェクトであれば、Anthony Pegramが示唆していることをしてください。

0
for (int i =0; i < TheMasterObject.ListOfMyObjectModel.size(); ++i) { 
    TheMasterObject.ListOfMyObjectModel.set(i, MyMethod(TheMasterObject.ListOfMyObjectModel.get(i))); 
} 

いくつかの変更は、それが私のゲスト

0

ではなくイテレータのforループを使用しすること、C#の上で動作できるようにする必要がある場合、私は、Javaの考え方でこれを書きました。

for (int i = 0; i < objectModels.Count; i++) { 
    objectModels[i] = MyMethod(objectModels[i]); 
} 

については、なぜ、この質問は、それを説明:これは Yを助け Why is the iteration variable readonly

希望を

関連する問題