【问题标题】:Updating a list of lists更新列表列表
【发布时间】:2012-03-27 22:23:39
【问题描述】:

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

List1 和 List2 是 String 类型,而 MainList 是其他 2 个列表的列表。

在我的应用程序中,我希望在应用程序运行时更新和更改列表的值,但我无法弄清楚如何执行此操作。

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

我的算法应该如下所示: * 如果是第一张图片,则将字符串添加到 List1。然后将 List1 添加到 MainList * 对于每个连续的图像,将该图像的字符串添加到 List2。然后将 List2 添加到 MainList。将 List1 设置为添加到 MainList 的最后一个 List。清除列表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
}

【问题讨论】:

  • @Hans Moolman StringList2.Clear();除非您说 StringList1 = StringList2...否则不会清除 StringList1...但我在您的代码中看不到...
  • 抱歉,伙计们,我的意思是说我是用 C# 做的。 斜体 StringList2.Clear();除非您说 StringList1 = StringList2 否则不会清除 StringList1 因为我将 StringList2 添加到我的 MainList 然后使用它来设置我的 StringList1,它实际上确实清除了它。我已经逐步完成了代码,在 StringList2.Clear() 之后,我的 StringList1 的值都为空。除非我在此过程中做错了什么,但我看不到任何暗示我的东西?

标签: c# list


【解决方案1】:

好的,让我引导你完成它

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

【讨论】:

    【解决方案2】:

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

    在你的 DoStuff() 方法中:

    MainStringList.Add(StringList2);
    

    ...这会将对象引用值添加到StringList2MainStringList。我希望你明白这一点。

    StringList1 = MainStringList[mainStringListCount - 1];
    

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

    方法中倒数第二行是:

    StringList2.Clear();
    

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

    编辑:Derp,Jodrell 打败了我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多