2012-03-27 81 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