如何在多个列表中交换两个项目

时间:2016-09-06 12:07:54

标签: c# list swap grasshopper

我们说我有这些数据:

列表:

  1. ListOfPoints = a
  2. ListOfPoints = b
  3. ListOfPoints = c
  4. ListOfPoints = d
  5. 现在我要做的是:在每个列表(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;
      }
    }
    

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

    以下是交换前后的列表图片: enter image description here

    感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您不应为列表中的每次迭代创建新的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; } } 实例。这样就可以重新进行迭代。由于种子是基于计时器的,因此每次都可能以相同的值播种,因此给出相同的值。

以下代码适用于我:

<script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">

    google.load('visualization', '1.0', {'packages':['corechart']});

    google.setOnLoadCallback(drawChart);

    function drawChart() 
    {
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Date');
        data.addColumn('number', 'Height');
        data.addColumn('number', 'Weight');
        data.addRows([ 
        <?php 
        $chart_info = $db->prepare("SELECT `height`, `weight`, `date_captured` FROM `child_results_capture` ");
        $chart_info->execute();
        $result = $chart_info->fetchAll(PDO::FETCH_ASSOC);

        $chart_data = '';

        foreach($result as $value)
        {
            $chart_data.="['".$value['date_captured']."',".$value['height'].",".$value['weight']."],";
            // var_dump($chart_data);exit;
            // echo $chart_data;    
        }
        echo $chart_data;
        ?> 
        ]);

        var options = {

          title: 'Height-Weight graph',

        width: 900,
        height: 500,
        series: {
          0: {axis: 'Height'},
          1: {axis: 'Weight'}
        },
        axes: {
          y: {
            Height: {label: 'Height (cm)'},
            Weight: {label: 'Weight (kg)'}
          }
        }
      };

        var chart = new google.visualization.LineChart(document.getElementById('graph_chart'));
        chart.draw(data, options);
    }   
    </script>
    <div id="graph_chart"></div>

答案 1 :(得分: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;
}

答案 2 :(得分: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'中交换我想要的任何内容,同时查看交换之前和之后的差异。