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单元格都包含对同一列表的引用
在这样的循环中,您需要添加一个新列表。添加一个新列表将为您创建的每个列表创建一个单独的引用。如果在其中一个列表上清除,则不会清除另一个列表。请澄清您的要求。请澄清您的要求。