Зацикливание списка и его настройка

#asp.net #.net #foreach

#asp.net #.net #foreach

Вопрос:

Я хочу сказать, что мой код работает правильно, но я не знаю, почему он так работает. Итак, чтобы было понятно, вот мой код:

 List<NewsFlash> newsfl = tsm.getNewsFlashes();

foreach (NewsFlash item in newsfl)
{
    item.smartform.dtDate = item.smartform.dtDate.ToShortDateString();
}

//Get all the newsFlash items and bind to the repeater
rptNewsFlash.DataSource = newsfl;
rptNewsFlash.DataBind();
  

Как вы можете видеть, я зацикливаю список newsfl и редактирую item.smartform.dtDate . Что для меня странно, так это то, что когда я редактирую item.smartform.dtDate , свойство dtDate в списке newsfl также изменяется. Это то, что я хочу, но я думаю, это немного странно, потому item что внутри цикла foreach не имеет ничего общего со списком newsfl ?

Надеюсь, вы поняли мой вопрос.

Спасибо

Ответ №1:

Каждый item foreach элемент — это просто ссылка на элемент с определенным индексом внутри newsfl — поэтому, когда ваш цикл завершен, вы обновили все item элементы в списке, и эти элементы сохраняют эти изменения. Это имеет смысл, потому что каждый элемент не является копией оригинала, это оригинал.

Итак, представьте item , newsfl[n] что в одной комнате две двери, и вы оказываетесь в одном и том же месте — и не имеет значения, через какую дверь я прихожу, если я начинаю передвигать мебель, она также перемещается для любого, кто входит через любую дверь.

С другой стороны, если бы этого не произошло, чего бы вы ожидали? Поскольку вы вносите изменения item , вы, конечно, хотите их сохранить?

Комментарии:

1. Я тестировал это. Я имел в виду создать еще один список и добавить все элементы в этот вновь созданный список в цикле. Но я не знал этой функции, поэтому теперь стало проще. Спасибо

Ответ №2:

В строке foreach (NewsFlash item in newsfl) вы берете ссылку called item на каждую из записей newsfl . Это не создает копию элемента, а просто ссылку на элемент в списке.

Таким образом, если вы обновите значение on item , запись in newfl также будет обновлена.

Ответ №3:

Почему это не должно быть изменено? Объект «item» в вашем цикле foreach — это точно такой же объект, как и в вашем списке «newsfl». На самом деле объект «item» указывает только на правильный объект в списке.