Вот один гипотетический способ, которым это могло бы произойти. Допустим, у вас есть метод, который берет существующий источник данных и создает Job
объектов из этого источника.
Примерно так:
public IEnumerable<Job> GetJobs() {
var rows = GetRowsFromDatabaseTable();
foreach (var row in rows)
yield return new Job(row.Name, row.Date, row.Etc);
}
Тогда, если у вас есть код, который сделал это:
var jobs = GetJobs();
UpdateYesterday(jobs);
foreach (var job in jobs)
Console.WriteLine(job);
Вы обнаружите, что задания, напечатанные с помощью Console.WriteLine
, не отражают обновления, выполненные в UpdateYesterday
. Это потому, что UpdateYesterday
перечислил бы по новым объектам, созданным GetJobs
, и тогда ваш foreach
цикл перечислил бы по новому набору новых объектов, созданных ( снова ) GetJobs
.
С другой стороны, если вы просто изменили первую строку на эту:
var jobs = GetJobs().ToList();
Тогда вы бы поместили все новые объекты, созданные с помощью GetJobs
, в список, где они сохранятся, и, таким образом, ваш цикл UpdateYesterday
и foreach
будет ссылаться на те же объекты (те, что в списке, который вы создали).
Это имеет смысл? Я думаю, что это вполне может быть проблемой, с которой вы столкнулись (в этом случае ответ, действительно, заключается в создании коллекции, такой как List<Job>
в памяти, из которой вы можете получить доступ к элементам для манипулирования).
В ответ на ваш вопрос о возможности определить, является ли IEnumerable
изменчивым или нет, хотя ... ну, я действительно не думаю, , что возможно.
Я удалил старый ответ, так как новый, кажется, нужен ОП.