2016-09-06 67 views
0

比方說,我有這樣的數據:如何在多個列表交換兩個項目

列表:

  1. ListOfPoints =一
  2. ListOfPoints = B
  3. ListOfPoints = C
  4. ListOfPoints = d

現在我想要做的是:swap每個列表中有兩個點(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

感謝您的幫助。

+0

備註:對於本地變量,「generation」比'Var'更好。您可能想要閱讀c#的命名約定。 – user3185569

+0

那是真的,我應該改變局部變量的名字。當我完成基本的程序時,我仍然會在最後改變一些東西。 – Meliss

+0

您的代碼遇到了什麼問題? – symmetricsaurus

回答

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; 
    } 
} 
+0

我要瘋了,它仍然不適合我:/ – Meliss

+0

我還沒有在Grasshopper中試過這個,只在C#控制檯應用程序中。也許這個問題是在你的應用程序中的其他地方?你可以在你的代碼中加入一個斷點,看看它是否在運行?否則,試着找出你從Random.Next()得到的值。 – symmetricsaurus

+0

嘿,我現在知道了原因。它實際上正在工作,但代碼將在兩個列表中交換點。我有一個我用這個代碼引用的初始列表,因此我不可能在交換之前和交換之後看到差異。爲了改變這種情況,我唯一需要做的就是:首先克隆初始列表,以便比較它們! @symmetricsaurus – Meliss

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; 
} 
+0

嘿@James R,謝謝。這也是一個好主意,但我只是克隆了列表,然後讓交換代碼運行。這是工作 :) – Meliss

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」掉任何我想要的,而之前和交換之後看到的差異。