TransWikia.com

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

Stack Overflow на русском Asked on November 26, 2020

Итак, есть список 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?

One Answer

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

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

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

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

Answered by Alex Netkachov on November 26, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP