0

假设我有这些数据:

列表:

  1. ListOfPoints = 一个
  2. ListOfPoints = b
  3. ListOfPoints = c
  4. ListOfPoints = d

现在我要做的是:在每个列表(a,b,c,d)中交换两个点,不幸的是它不起作用。

我尝试了以下代码:

List<List<Point3d>> currentGeneration = handoverPopulation.ToList();
foreach(List<Point3d> generation in currentGeneration)
{
  int index1;
  int index2;
  Random r = new Random();
  index1 = r.Next(0, generation.Count);
  index2 = r.Next(0, generation.Count);

  if(index1 != index2)
  {
    Point3d cache = generation[index1];
    generation[index1] = generation[index2];
    generation[index2] = cache;
  }
}

如何同时交换多个列表中的两个点,或者为什么我的方法不起作用?

这是交换前后列表的图片: 在此处输入图像描述

谢谢你的帮助。

4

3 回答 3

1

这是因为当您尝试交换点时,您正在处理引用类型。创建“新”点(而不是引用现有点)解决了这个问题。在 Grasshopper C# 中测试。

int index1;
int index2;
Random r = new Random();
index1 = r.Next(0, generation.Count);
index2 = r.Next(0, generation.Count);

if(index1 != index2)
{
  Point3d cache = new Point3d(generation[index1]);
  generation[index1] = new Point3d(generation[index2]);
  generation[index2] = cache;
}
于 2016-09-25T19:05:03.913 回答
1

您不应Random为列表中的每个迭代创建一个新实例。这样,它就会重新播种以进行迭代。由于种子是基于计时器的,因此每次都可能使用相同的值播种,从而给出相同的值。

下面的代码对我有用:

Random r = new Random();
foreach (List<Point3d> generation in currentGeneration)
{
    int index1;
    int index2;
    index1 = r.Next(0, generation.Count);
    index2 = r.Next(0, generation.Count);

    if (index1 != index2)
    {
        Point3d cache = generation[index1];
        generation[index1] = generation[index2];
        generation[index2] = cache;
    }
}
于 2016-09-06T12:44:13.710 回答
0

谢谢你的帮助。

我发现了为什么它不起作用或者为什么我看不到任何区别。这是因为有我想交换积分的初始列表。为此,我只是复制了孔列表,并让交换代码运行。但是,该程序会在两个列表中交换,因此我无法看到差异。

毕竟麻烦 :) 我唯一要做的就是克隆初始列表。所以我尝试了这个:

public static List<List<Point3d>> createGenerations(List<List<Point3d>> cGP, List<double> cGF, int genSize, Point3d startPoint)
{
 List<List<Point3d>> currentGeneration = new List<List<Point3d>>(cGP.Count);
 cGP.ForEach((item) => {currentGeneration.Add(new List<Point3d>(item));});
}

现在我可以在“currentGeneration”中交换我想要的任何东西,同时查看交换前后的差异。

于 2016-09-28T10:44:44.417 回答