我们说我有这些数据:
列表:
现在我要做的是:在每个列表(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;
}
}
如何同时交换多个列表中的两个点或为什么我的方法不起作用?
感谢您的帮助。
答案 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'中交换我想要的任何内容,同时查看交换之前和之后的差异。