1

次のスニペットから始めましょう。

Foreach(Record item in RecordList){
  ..
  item = UpdateRecord(item, 5);
  ..
}

UpdateRecode 関数は、アイテムの一部のフィールドを変更し、変更されたオブジェクトを返します。この場合、コンパイラは foreach 反復でアイテムを更新できないことを示す例外をスローします。

UpdateRecord メソッドは void を返すように変更され、スニペットは次のようになります。

Foreach(Record item in RecordList){
  ..
  UpdateRecord(item, 5);
  ..
}

この場合、レコードは参照型であるため、アイテムは更新されます。しかし、コードが読めなくなります。

私が取り組んでいるプロジェクトには、ほぼ同じコードの foreach ループがたくさんあるので、レコードの一部を更新するメソッドを作成したいと考えています。これを行う良い方法はありますか?コードをさらに破棄するのではなく、コードを読みやすくするものはありますか?

4

3 に答える 3

1

コレクションを更新する必要がある場合は、あなたが言ったように、エラーが発生しやすいか、臭いがするイテレータ パターンを使用しないでください。

この状況では、インデックスを使用して for ループを使用する方が少し明確であることがわかります。これは、その方法で何をしようとしているのかが非常に明白であるためです。

于 2008-11-15T15:31:14.063 に答える
1

コンパイラは、レコードではなくコレクションを更新できないと不平を言っています。item = UpdateRecord を実行することで、反復子変数 item を再割り当てしています。

UpdateRecord(item, 5) が何らかの形で判読できないことに同意しませんが、気分が良くなる場合は、拡張メソッドを使用すると、 item の内容を変更していることがより明確になる場合があります。

static void Update(this Record item, int value) {
   // do logic
}

foreach (Record item in RecordList) {
   item.Update(5);
}
于 2008-11-15T16:18:53.467 に答える
0

同じリストを更新する必要がありますか? 代わりに、新しい (更新された) 列挙を返していただけますか?

foreach(Record item in RecordList){
  ..
  yield return GetUpdatedRecord(item, 5);
  ..
}
于 2008-11-15T15:36:47.983 に答える