正在更新列表列表

本文关键字:列表 更新 | 更新日期: 2023-09-27 18:29:23

我有一个应用程序,它有几个列表,可以在应用程序运行期间跟踪一些值。特别是它有List1、List2和MainList。

List1和List2的类型为String,MainList是另外两个列表的列表。

在我的应用程序中,我希望在应用程序运行时更新和更改列表的值,但我很难弄清楚如何做到这一点。

它是一个处理文件中照片的图像处理应用程序。应用程序需要处理文件中所有照片的列表值。因此,它将有一个循环,迭代所有照片,并在每次迭代时更新列表。

我的算法应该如下所示:*如果是第一个图像,请将字符串添加到List1中。然后将List1添加到MainList*对于每个连续的图像,将这些图像的字符串添加到List2中。然后将List2添加到MainList中。将List1设置为添加到MainList的最后一个列表。清除List2

问题是,当我清除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
}

正在更新列表列表

好的,让我带你了解一下

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

以下是我注意到的一些问题(本想对此发表评论,但如果没有一些间距,它太复杂了)。

在DoStuff()方法中:

MainStringList.Add(StringList2);

这将向CCD_ 1到CCD_ 2添加对象引用值。我希望你能理解。

StringList1 = MainStringList[mainStringListCount - 1];

这将获得添加到MainStringList的最后一个值,这是您刚刚在DoStuff方法的第一行代码中添加的值。

方法中倒数第二行是:

StringList2.Clear();

StringList1是对与StringList2的堆栈引用所指向的对象完全相同的对象的堆栈引用。因此,本质上,您在这里有一个实际使用的列表,最后它完全为空,因为您在指向唯一List堆对象的堆栈参考上调用了Clear()。您需要创建新的List对象,而不是一遍又一遍地使用同一个对象。

编辑:Derp,Jodrell打败了我。