C# MyList=新列表<;int>;(); 工作正常,但MyList.Clear();不';T

C# MyList=新列表<;int>;(); 工作正常,但MyList.Clear();不';T,c#,.net,list,C#,.net,List,我不确定我是否遗漏了什么,但是下面的代码不会产生我期望的输出,除非我更改行list.Clear()到列表=新列表() 作为输出,但当清除它时,输出为“//” 为什么会发生这种情况?这并不是你想象的那样: ListOfLists.Add(TheList); 创建列表的实例时,内存中有一个这样的列表。当您将列表添加到列表时,内存中仍然只有一个原始列表。上面的代码行不创建副本 所以当你这样做的时候: TheList.Clear(); TheList = new List<int>();

我不确定我是否遗漏了什么,但是下面的代码不会产生我期望的输出,除非我更改行
list.Clear()
列表=新列表()

作为输出,但当清除它时,输出为
“//”


为什么会发生这种情况?

这并不是你想象的那样:

ListOfLists.Add(TheList);
创建列表的实例时,内存中有一个这样的列表。当您将
列表
添加到
列表
时,内存中仍然只有一个原始列表。上面的代码行不创建副本

所以当你这样做的时候:

TheList.Clear();
TheList = new List<int>();
您可以对内存中的一个列表执行清除操作。任何包含对该列表引用的代码(例如
ListOfLists
中的元素)都能够观察到该更改。那一张单子已被清除

但是,执行此操作时:

TheList.Clear();
TheList = new List<int>();
TheList=新列表();

您可以在内存中创建一个新的单独列表,只需将变量
TheList
更改为指向新列表而不是原始列表。如果没有对原始列表的其他引用,垃圾收集器将从内存中清除该列表。然而,仍然有人提到它。它是列表中的一个元素。在上面一行之后,您现在在内存中有两个列表。您在此新列表上执行的任何操作都不会影响原始列表。

这不会像您认为的那样:

ListOfLists.Add(TheList);
创建列表的实例时,内存中有一个这样的列表。当您将
列表
添加到
列表
时,内存中仍然只有一个原始列表。上面的代码行不创建副本

所以当你这样做的时候:

TheList.Clear();
TheList = new List<int>();
您可以对内存中的一个列表执行清除操作。任何包含对该列表引用的代码(例如
ListOfLists
中的元素)都能够观察到该更改。那一张单子已被清除

但是,执行此操作时:

TheList.Clear();
TheList = new List<int>();
TheList=新列表();
您可以在内存中创建一个新的单独列表,只需将变量
TheList
更改为指向新列表而不是原始列表。如果没有对原始列表的其他引用,垃圾收集器将从内存中清除该列表。然而,仍然有人提到它。它是列表中的一个元素。在上面一行之后,您现在在内存中有两个列表。在此新列表上执行的任何操作都不会影响原始列表。

此行:

ListOfLists.Add(TheList);
实际上添加了对列表的引用,而不是它的副本。所以当你这么做的时候

TheList.Clear();
您还将清除存储在ListofList中的同一列表

我建议您不需要使用
清除()
,而只需每次声明一个新列表:

 List<List<int>> ListOfLists = new List<List<int>>();
 List<int> TheList = new List<int>();

 for (int i = 1; i <= 30; i++)
 {
    TheList.Add(i);

    if (TheList.Count < 10)
       Console.WriteLine(i.ToString() + " adicionado");
    else
    {
       ListOfLists.Add(TheList);
       TheList = new List<int>();
    }
 }
List ListOfLists=new List();
列表列表=新列表();
对于(inti=1;i这条线:

ListOfLists.Add(TheList);
实际上添加了对列表的引用,而不是它的副本

TheList.Clear();
您还将清除存储在ListofList中的同一列表

我建议您不需要使用
清除()
,而只需每次声明一个新列表:

 List<List<int>> ListOfLists = new List<List<int>>();
 List<int> TheList = new List<int>();

 for (int i = 1; i <= 30; i++)
 {
    TheList.Add(i);

    if (TheList.Count < 10)
       Console.WriteLine(i.ToString() + " adicionado");
    else
    {
       ListOfLists.Add(TheList);
       TheList = new List<int>();
    }
 }
List ListOfLists=new List();
列表列表=新列表();

对于(inti=1;i我将尽可能地回答这个问题。 当您将列表添加到ListOfLists时,您正在将列表的引用(内存位置)添加到ListOfLists。因此,如果使用clear,在循环结束时,ListOfLists中将有3个空列表,因为您已清除列表引用3次;每个ListOfLists单元格都包含对同一列表的引用


在这样的循环中,您需要添加一个新列表。添加一个新列表将为您创建的每个列表创建一个单独的引用。如果在其中一个列表上清除,则不会清除另一个列表。

我将尽可能回答这个问题。 当您将列表添加到ListOfLists时,您正在将列表的引用(内存位置)添加到ListOfLists。因此,如果使用clear,在循环结束时,ListOfLists中将有3个空列表,因为您已清除列表引用3次;每个ListOfLists单元格都包含对同一列表的引用


在这样的循环中,您需要添加一个新列表。添加一个新列表将为您创建的每个列表创建一个单独的引用。如果在其中一个列表上清除,则不会清除另一个列表。

请澄清您的要求。请澄清您的要求。