Изменение свойств элементов List массива через метод в цикле foreach C#

Итак, есть список List<Rectangle> rect_list = new List<Rectangle>();, нужно в цикле изменить свойство Location для всех объектов, у меня долго не получалось, делал через все возможные циклы foreach:


Так

foreach (var T in rect_list)
{
  T.Offset(-50, 0);
}

И так

rect_list.ForEach(delegate (Rectangle offset)
{
  offset.Offset(-50, 0);
});

Проблема в том что свойства объектов не меняются вообще, как будто с ними ничего и не делают, проблему я решил так:

for (int i = 0; i < rect_list.Count; i++)
{
  rect_list[i] = new Rectangle(rect_list[i].X -50, rect_list[i].Y, 50, 50);
}

Но хотелось бы сделать это через foreach это возможно сделать? или он годится только для вывода информации куда либо?


В общем вопрос такой, как сделать то что у меня сделано в цикле for через цикл foreach?


Ответы (1 шт):

Автор решения: Alex Netkachov

Rectangle является структурой. Особенность структур в том, что присваивания осуществляется через копирование. foreach разворачивается в такую структуру:

var e = rect_list.GetEnumerator();
while(e.MoveNext()) {
  Rectangle r = e.Current;
  ...
}

Соотвественно, все, что произойдет с r будет происходить с копией элемента.

Поэтому ответ на вопрос "как сделать то что у меня сделано в цикле for через цикл foreach" - никак.

→ Ссылка