Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Изменение данных во время выполнения цикла foreach / 18 сообщений из 18, страница 1 из 1
29.10.2013, 14:27
    #38445078
rihel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
Ситуация такая - в foreach прогоняется по циклу элементы коллекции. У элементов этой коллекции есть свойства, содержащие координаты в виде x1, y1, x2, y2. Если я просматриваю в режиме дебаг значения этих полей - все отрабатывает как надо. Но если я просто запускаю или прогоняю дебагом без просмотра значений свойств в коллекции - идет изменение значений этих полей на какую-то фигню. В итоге элемент располагается не там и не такого размера. Самое интересное, что если я перед этим в том же foreach прогоняю эту коллекцию и пишу ее координаты в файл - все ок. Пользоваться lock пробовал - пытался запретить изменение значений полей внутри коллекции, но это не помогло. В чем может быть проблема?
...
Рейтинг: 0 / 0
29.10.2013, 14:32
    #38445086
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
rihelВ чем может быть проблема?

Проблема в коде.
...
Рейтинг: 0 / 0
29.10.2013, 14:44
    #38445116
rihel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
Спасибо, кэп. Только я использую общий проект, баг не мой, поэтому хотелось бы понять где могли наложить кучу, понять причину и, если возможно, обойти ее.
...
Рейтинг: 0 / 0
29.10.2013, 14:49
    #38445135
Абсолют
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
rihelСпасибо, кэп. Только я использую общий проект, баг не мой, поэтому хотелось бы понять где могли наложить кучу, понять причину и, если возможно, обойти ее.

100% в коде.
...
Рейтинг: 0 / 0
29.10.2013, 14:49
    #38445137
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
rihelСпасибо, кэп. Только я использую общий проект, баг не мой, поэтому хотелось бы понять где могли наложить кучу, понять причину и, если возможно, обойти ее.

Ну тут великие телепаты и видят ошибку в коде, даже когда кода не видят. Это же так просто.

Вариант с использованием телепатии у меня только один: если в дебаге все норм, в файл записывается хорошо, а компоненты раскладываются криво, то дело не коллекции координат. Может, у вас anchors или dock выставлены неверно. Есть какой-то фактор, влияющий на размещение компонент
...
Рейтинг: 0 / 0
29.10.2013, 14:49
    #38445139
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
rihelСпасибо, кэп

И да, я майор (запаса) :-)
...
Рейтинг: 0 / 0
29.10.2013, 15:04
    #38445181
rihel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ElementCollection collection = elementEditor.Elements;
            
	    /*Абсолютно ненужный кусок кода, который решает проблему*/
            foreach (Element element in collection)
            { 
                double d = frag.X1; 
            }
            
	    foreach (Element elem in collection)
            {
                System.Drawing.Rectangle rect = new System.Drawing.Rectangle(
                    elem .X1,            
                    elem .Y1, 
                    elem .Width, 
                    elem .Height);
            }


Вот здесь введение первого foreach почему-то решает проблему. Без него если в дебаге просмотеть значение любого элемента коллекции - тоже все ок. А если просто жать F5 - та же ошибка как и при запуске приложения.
...
Рейтинг: 0 / 0
29.10.2013, 15:07
    #38445193
Абсолют
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
rihel,

посмотрите в реализацию свойств X1 и Y1.
...
Рейтинг: 0 / 0
29.10.2013, 15:08
    #38445194
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
rihel
Код: c#
1.
2.
3.
4.
5.
	    /*Абсолютно ненужный кусок кода, который решает проблему*/
            foreach (Element element in collection)
            { 
                double d = frag.X1; 
            }


Этот абсолютно ненужный кусок кода в Release будет убран компилятором


rihel
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	    foreach (Element elem in collection)
            {
                Element closureVariable = elem;

                System.Drawing.Rectangle rect = new System.Drawing.Rectangle(
                    closureVariable.X1,            
                    closureVariable.Y1, 
                    closureVariable.Width, 
                    closureVariable.Height);
            }



Попробуйте так.

Да, и как вы определили, что "не там и не того размера"?
...
Рейтинг: 0 / 0
29.10.2013, 15:09
    #38445198
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
Абсолютrihel,

посмотрите в реализацию свойств X1 и Y1.

Точно, еще код класса Element
...
Рейтинг: 0 / 0
29.10.2013, 16:25
    #38445393
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
Вот этот код работает без неожиданностей

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var lst = new[]
                {
                    new Element() {X1 = 10, Y1 = 10, Width = 100, Height = 100},
                    new Element() {X1 = 120, Y1 = 120, Width = 50, Height = 75},
                    new Element() {X1 = 500, Y1 = 500, Width = 83, Height = 115},
                    new Element() {X1 = 333, Y1 = 444, Width = 100, Height = 100},
                    new Element() {X1 = 100, Y1 = 200, Width = 20, Height = 70}
                };

            var graphics = this.CreateGraphics();

            foreach (Element elem in lst)
            {
                Rectangle rect = new Rectangle(
                    elem.X1,
                    elem.Y1,
                    elem.Width,
                    elem.Height);

                graphics.DrawRectangle(new Pen(Color.Red), rect);
            }
        }
    }

    public class Element
    {
        public int X1 { get; set; }
        public int Y1 { get; set; }
        public int Width { get; set; }
        public int Height { get; set; }
    }
}
...
Рейтинг: 0 / 0
29.10.2013, 17:25
    #38445555
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
Вангану, что в другом потоке кто-то наводит порчу на коллекцию
...
Рейтинг: 0 / 0
29.10.2013, 17:36
    #38445575
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
Как c lockoм пробовал?
...
Рейтинг: 0 / 0
30.10.2013, 03:49
    #38446031
Абсолют
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
Тема из жанра "А был ли мальчик?"
...
Рейтинг: 0 / 0
30.10.2013, 06:19
    #38446050
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
rihel,

подкину одну мысль. вы работаете со struct.
...
Рейтинг: 0 / 0
30.10.2013, 16:27
    #38446997
rihel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
hVosttrihel,

подкину одну мысль. вы работаете со struct.
И в чем сама мысль?
...
Рейтинг: 0 / 0
30.10.2013, 17:51
    #38447219
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
rihelhVosttrihel,

подкину одну мысль. вы работаете со struct.
И в чем сама мысль?

Я тоже сразу подумал о структурах.
О вреде изменяемых значимых типов.
...
Рейтинг: 0 / 0
30.10.2013, 20:32
    #38447431
Абсолют
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение данных во время выполнения цикла foreach
rihelhVosttrihel,

подкину одну мысль. вы работаете со struct.
И в чем сама мысль?

Чем дело-то закончилось?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Изменение данных во время выполнения цикла foreach / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]