Pergunta

Vamos começar com o seguinte trecho:

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

A função UpdateRecode muda algum campo do item e retorna o objeto alterado. Neste caso, o compilador gera uma exceção dizendo que o item não pode ser atualizado em uma iteração foreach.

Agora, o método UpdateRecord é alterado para que ele retorna vazio e o trecho ficaria assim:

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

Neste caso, o item deve ser atualizado porque Record é um tipo de referência. Mas faz o código ilegível.

O projeto que estou trabalhando tem muita foreach-loops com a quase o mesmo código mais e mais, então eu gostaria de criar métodos que partes de atualização dos registros. Existe uma boa maneira de fazer isso? Um que tornar o código mais legível, em vez de destruindo-o mais mais?

Foi útil?

Solução

Se você precisar atualizar uma coleção, não use um padrão de iterador, como você disse, sua ou propenso a erros, ou cheira mal.

Eu acho que o uso de um loop com um índice um pouco mais claro nesta situação, como a sua muito óbvio o que você está tentando fazer dessa forma.

Outras dicas

O compilador está reclamando que você não pode atualizar a coleção , e não o registro. Fazendo ITEM = UpdateRecord, você está a reatribuição o item variável iterador.

Eu discordo que UpdateRecord (item, 5) é de alguma forma ilegível - mas se isso te faz sentir melhor, um método de extensão pode torná-lo mais claro que você está alterando o conteúdo do item

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

foreach (Record item in RecordList) {
   item.Update(5);
}

Você precisa atualizar a mesma lista? você poderia retornar uma nova enumeração (atualizado) em vez?

foreach(Record item in RecordList){
  ..
  yield return GetUpdatedRecord(item, 5);
  ..
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top