2012-03-27 71 views
0

我有一個應用程序有幾個列表來跟蹤運行應用程序期間的一些值。特別是它有List1,List2和MainList。更新列表的列表

List1和List2是String類型,MainList是其他兩個列表的列表。

在我的應用程序中,我希望在應用程序運行時更新和更改列表的值,但我無法弄清楚如何執行此操作。

它是一個圖像處理應用程序,處理來自文件的照片。應用程序需要處理文件中所有照片的列表值。因此,它將有一個循環遍歷所有照片,並在每次迭代時更新列表。

我的算法應該看起來如下: *如果它的第一個圖像,將字符串添加到List1。然後將List1添加到MainList *對於每個連續的圖像,將該圖像的字符串添加到List2。然後將List2添加到MainList。將List1設置爲添加到MainList的最後一個列表。清除列表2

問題是,當我清除List2數據時,它也會清除已設置的List1的數據。我怎樣才能阻止這種情況發生。我已經附上我的代碼,希望更有意義。在我的代碼中,我省略了檢查,看看它是否是第一張圖像,因爲我只是測試算法。

List<List<String>> MainStringList = new List<List<String>>(); 
List<String> StringList1 = new List<String>(); 
List<String> StringList2 = new List<String>(); 

StringList1.Add("My Car"); 
StringList1.Add("My Engine"); 
StringList1.Add("My Wheel"); 

MainStringList.Add(StringList1); 

StringList2.Add("My Flower"); 
StringList2.Add("My Honey"); 
StringList2.Add("My Love Heart"); 

DoStuff(StringList1, StringList2); 

private void DoStuff(List<String> StringList1, List<String> StringList2) 
{ 
    // Perform some calculations 
    // Then add to list 
    MainStringList.Add(StringList2); 

    int mainStringListCount = MainStringList.Count; 

    StringList1 = MainStringList[mainStringListCount - 1]; 

    String test1 = StringList1[2]; 

    StringList2.Clear(); 

    String test2 = StringList1[2];  // Problem is here - clears StringList2 as well as StringList1 
} 
+0

@Hans Moolman StringList2.Clear();將不會清除StringList1,除非你說StringList1 = StringList2 ...但我沒有看到你的代碼... – NiK 2012-03-27 22:35:05

+0

糟糕的傢伙,本來打算說我在C#做它。 _italic StringList2。明確();不會清除StringList1,除非你說StringList1 = StringList2_因爲我添加StringList2到我的MainList,然後用它來設置我的StringList1,它實際上清除它。我已經遍歷了代碼,並且在StringList2.Clear()之後,我的StringList1的值全爲空。除非我在路上做別的事情,但我不能看到任何暗示我的東西? – heyred 2012-03-28 08:34:37

回答

0

好吧,讓我一步,你通過它

MainStringList.Add(StringList2); 
// list count goes up from 1 to 2 

int mainStringListCount = MainStringList.Count; 
// Set mainStringListCount = 2 

StringList1 = MainStringList[mainStringListCount - 1]; 
// Set StringList1 to the reference at index 1 (2 - 1) of your array 
// This sets Stringlist1 to StringList2 since arrays are 0 based. 
// StringList1 and StringList2 now both referece the same list. 

StringList2.Clear(); 
// Clears the list that is referecned by both variables 
0

這裏是我發現的幾個問題(會作出這樣的評論,但它太複雜,沒有一定的間距)。

在你DoStuff()方法:

MainStringList.Add(StringList2); 

...這增加了對象的參考價值StringList2MainStringList。我希望你明白這一點。

StringList1 = MainStringList[mainStringListCount - 1]; 

...這被添加到MainStringList的最後一個值是您剛剛添加的內容中的第一行代碼在你DoStuff方法。

第二至在該方法中的最後一行是:

StringList2.Clear(); 

StringList1是堆棧參考該StringList2的堆棧參考指向完全相同的對象。所以基本上,你在這裏有一個實際使用的列表,最後它完全是空的,因爲你在堆棧引用上調用Clear(),它指向唯一的堆對象List。您需要創建新的List對象,而不是一遍又一遍地使用同一個對象。

編輯:Derp,喬德雷打敗了我。

+0

那麼,你的答案也是對的 – Jodrell 2012-07-02 17:02:32