Сброс списка на новое количество объектов

У меня проблема с накоплением Point3ds в Списке. Когда я меняю количество агентов int (с помощью ползунка gui в кузнечике), количество увеличивается, а не сбрасывается до того, каким должно быть новое количество. Я предполагаю, что где-то я должен был бы повторно инициализировать список или очищать его каждый раз, когда значение изменяется? Что было бы правильно сделать это?

        protected override void SolveInstance(IGH_DataAccess DA)
        {
            BoundingBox box = new BoundingBox(0.0, 0.0, 0.0, boundx, boundy, boundz);
            DA.SetData("Bounding Box", box);
            DA.SetData("Start", "The current trigger is set to " + started.ToString());

            // Initialize Agents
            for (int i = 0; i < agents; i++)
            {
                double xPos = RandomfromDouble(0.0, boundx);
                double yPos = RandomfromDouble(0.0, boundy);
                double zPos = RandomfromDouble(0.0, boundz);

                Point3d pos = new Point3d(xPos, yPos, zPos);        // Create Agent Start Position
                Vector3d vec = new Vector3d(xPos + RandomfromDouble(-360.00, 360.00), yPos + RandomfromDouble(-360.00, 360.00), zPos + RandomfromDouble(-360.00, 360.00));  // Create Agent Start Vector

                Agent agent = new Agent(pos, vec, alignment, separation, cohesion, neighborRadius);
                allAgents.Add(agent);

                DA.SetData("Debug", "# of Agents Created: " + allAgents.Count);
            }

            // Get agent positions
            List<Point3d> agentPositions = new List<Point3d>();
            List<Vector3d> agentVectors = new List<Vector3d>();

            agentPositions = allAgents.Select(agent => agent.Pos).ToList();
            agentVectors = allAgents.Select(agent => agent.Vec).ToList();

            DA.SetData("Agent Count", allAgents.Count);
            DA.SetDataList("Agent Points", agentPositions);
            DA.SetDataList("Agent Vectors", agentVectors);

            if (started)
            {
                DA.SetData("Start", "The current trigger is set to " + started.ToString());

                for (int i = 0; i < generations; i++)
                {
                    DA.SetData("Debug", "# of Generations: " + i);

                    foreach (Agent agent in allAgents)
                    {
                        DA.SetData("Debug", "# of Agents: " + i);

                        agent.UpdateAgent(allAgents);
                    }
                }
            }
            else if (!started)
            {
                DA.SetData("Start", "The current trigger is set to " + started.ToString());
                //return;
            }
        }

        public double RandomfromDouble(double from, double to)
        {
            double diff = Math.Abs(from - to);
            return rnd.NextDouble() * diff + from ;
        }

1 ответ

Решение

Когда вы задаете такой вопрос, было бы полезно, если бы вы включили пример Minimal, Complete и Verifiable, а не длинный список таких кодов.

Если я правильно читаю ваш код, проблема в том, что allAgents список становится все длиннее. Как вы уже догадались, это потому, что вы создаете список один раз, вверху, а затем добавляете его только в for цикл, который говорит // Initialize Agents,

Если в этот момент вы намерены сбросить список, прежде чем вводить for цикл я думаю, что вам нужно сделать allAgents.Clear(), Это очистит список, а затем вы переберите и добавите новый Agentв цикле.

Другие вопросы по тегам