Mudando item na foreach através de método
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?
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);
..
}