Начнем со следующего фрагмента:
Foreach(Record item in RecordList){
..
item = UpdateRecord(item, 5);
..
}
Функция UpdateRecode изменяет какое-то поле элемента и возвращает измененный объект. В этом случае компилятор выдает исключение, в котором говорится, что элемент не может быть обновлен в итерации foreach.
Теперь метод UpdateRecord изменен так, что он возвращает void, и фрагмент будет выглядеть так:
Foreach(Record item in RecordList){
..
UpdateRecord(item, 5);
..
}
В этом случае элемент будет обновлен, потому что запись является ссылочным типом. Но это делает код нечитаемым.
В проекте, над которым я работаю, много циклов foreach с почти одним и тем же кодом снова и снова, поэтому я хотел бы создать методы, обновляющие части записей. Есть хороший способ сделать это? Тот, который делает код более читабельным, вместо того, чтобы его еще больше разбивать?





Если вам нужно обновить коллекцию, не используйте шаблон итератора, как вы сказали, он либо подвержен ошибкам, либо плохо пахнет.
Я считаю, что использование цикла for с индексом в этой ситуации немного понятнее, поскольку совершенно очевидно, что вы пытаетесь сделать таким образом.
Нет ничего плохого в использовании шаблона итератора для обновления элементов в коллекции. Вы не хотите добавлять или удалять элементы из коллекции во время итерации, и это то, на что жалуется компилятор.
Вам нужно обновить тот же список? Не могли бы вы вместо этого вернуть новое (обновленное) перечисление?
foreach(Record item in RecordList){
..
yield return GetUpdatedRecord(item, 5);
..
}
Спасибо за ваш комментарий. В моем случае доходность - не вариант. Но буду иметь в виду, может пригодиться ...
Компилятор жалуется, что вы не можете обновить коллекция, а не запись. Выполняя item = UpdateRecord, вы переназначаете переменную итератора item.
Я не согласен с тем, что UpdateRecord (item, 5) каким-либо образом не читается, но если это заставляет вас чувствовать себя лучше, метод расширения может прояснить, что вы меняете содержимое элемента.
static void Update(this Record item, int value) {
// do logic
}
foreach (Record item in RecordList) {
item.Update(5);
}
Спасибо, я думаю, что это единственный правильный выход в моей ситуации.