如何在c#中重用列表?
在开始循环之前,我声明一个如何在c#中重用列表?,c#,list,C#,List,在开始循环之前,我声明一个列表和一个列表。然后将一些元素添加到列表中。在一个条件之后,我将列表添加到列表。此时,我需要清除列表,以便再次使用它,但这也会从列表中删除元素,这是我不希望发生的事情,我该怎么办 int counter; List<List<T>> parent= new List<List<T>>(); List<T> child= new List<T>(); for (counter = 0; counter
列表
和一个列表
。然后将一些元素添加到列表中
。在一个条件之后,我将列表
添加到列表
。此时,我需要清除列表
,以便再次使用它,但这也会从列表
中删除元素,这是我不希望发生的事情,我该怎么办
int counter;
List<List<T>> parent= new List<List<T>>();
List<T> child= new List<T>();
for (counter = 0; counter <= group.Count - 2; counter++)
{
// some code here
if ( /* condition */ )
{
child.Add(element);
child.Add(element2);
parent.Add(child);
child.Clear();
}
}
int计数器;
列表父项=新列表();
列表子项=新列表();
对于(counter=0;counter您不能重用子列表。列表是类,因此引用类型。这意味着您实际上不会将子列表对象本身存储在父列表中,而是将引用存储在您创建的唯一子列表中。因此,列表的所有位置都指向相同的唯一子列表。
每次都必须创建一个新的子列表
List<List<T>> parent = new List<List<T>>();
for (counter = 0; counter <= group.Count - 2; counter++)
{
if (condition)
{
var child = new List<T>();
child.Add(element);
child.Add(element2);
parent.Add(child);
}
}
重复使用该列表的结果将是:
child list
+-----------+
parent list +--->| |
+--------+ | |-----------|
| |o----->| | |
|--------| | |-----------+
| |o----->| | |
|--------| | +-----------+
| |o----->|
|--------| |
| |o----->|
|--------| |
| |o------+
+--------+
不能重复使用子列表。列表是类,因此是引用类型。这意味着您实际上不会将子列表对象本身存储在父列表中,而是将引用存储在您创建的唯一子列表中。因此,列表的所有位置都指向同一唯一子列表。
每次都必须创建一个新的子列表
List<List<T>> parent = new List<List<T>>();
for (counter = 0; counter <= group.Count - 2; counter++)
{
if (condition)
{
var child = new List<T>();
child.Add(element);
child.Add(element2);
parent.Add(child);
}
}
重复使用该列表的结果将是:
child list
+-----------+
parent list +--->| |
+--------+ | |-----------|
| |o----->| | |
|--------| | |-----------+
| |o----->| | |
|--------| | +-----------+
| |o----->|
|--------| |
| |o----->|
|--------| |
| |o------+
+--------+
由于=new List()
不是您的选项,
将子列表添加到父列表时,可以调用子列表上的ToList()
parent.Add(child.ToList());
这将导致一个新的单独列表被添加到parent
之后,可以安全地清除子列表
int counter;
List<List<T>> parent= new List<List<T>>();
List<T> child= new List<T>();
for (counter = 0; counter <= group.Count - 2; counter++)
{
// some code here
if (//condition)
{
child.Add(element);
child.Add(element2);
parent.Add(child.ToList());
child.Clear();
}
}
int计数器;
列表父项=新列表();
列表子项=新列表();
对于(计数器=0;计数器,因为=new List()
不是您的选项,
将子列表添加到父列表时,可以调用子列表上的ToList()
parent.Add(child.ToList());
这将导致一个新的单独列表被添加到parent
之后,可以安全地清除子列表
int counter;
List<List<T>> parent= new List<List<T>>();
List<T> child= new List<T>();
for (counter = 0; counter <= group.Count - 2; counter++)
{
// some code here
if (//condition)
{
child.Add(element);
child.Add(element2);
parent.Add(child.ToList());
child.Clear();
}
}
int计数器;
列表父项=新列表();
列表子项=新列表();
for(counter=0;counter为什么new List
不是选项?new List();在循环内部,但这不是我的选项
-坦白地说,如果你要清除原始列表,这是唯一的选项。此外,由于“子”列表在循环的所有迭代中都被重用,你必须清除它,以避免将不同迭代中的子列表混在一起。因此,要么不要太担心,要么不要害怕创建太多很多对象,只需在每次迭代中创建一个新的子列表,或者停止使用列表并使用其他东西…-我不知道是什么。@KlausGütter:他已经写了注意:我知道解决方案之一是使用new list();在循环内部,但这对我来说不是一个选项。
因此,这样一个没有解释或说服他的理由的注释是毫无意义的。如果这不是一个选项,那么你就不走运。列表
是一种引用类型。当你将其添加到外部列表时,你向你构建和填写的列表添加了一个引用。如果你清除了该选项,则st,外部列表中的引用仍将引用同一个列表,但它将为空。为什么它不会成为您的“选项”。这是做您想做的事情的正确方式为什么是new list
不是选项?new list();在循环内部,但这不是我的选项
-坦白地说,如果你要清除原始列表,这是唯一的选项。此外,由于“子”列表在循环的所有迭代中都被重用,你必须清除它,以避免将不同迭代中的子列表混在一起。因此,要么不要太担心,要么不要害怕创建太多很多对象,只需在每次迭代中创建一个新的子列表,或者停止使用列表并使用其他东西…-我不知道是什么。@KlausGütter:他已经写了注意:我知道解决方案之一是使用new list();在循环内部,但这对我来说不是一个选项。
因此,这样一个没有解释或说服他的理由的注释是毫无意义的。如果这不是一个选项,那么你就不走运。列表
是一种引用类型。当你将其添加到外部列表时,你向你构建和填写的列表添加了一个引用。如果你清除了该选项,则st,外部列表中的引用仍将引用同一个列表,但它将是空的。为什么它对您来说不是“一个选项”。这是做您想做的事情的正确方式非常感谢,这正是我需要的,它可以工作:)这个解决方案不是比使用新列表()更糟糕吗??child.ToList()实际上使用了新列表()通过遍历每个项目并将其复制到列表中来复制项目。因此,这种方法不如简单地使用child=new list();@Tartori我同意,但这是满足OP不使用=new list()的要求的唯一方法
。OP假设列表的行为类似于值类型,即其内容在parent.Add(child)处复制
。在这种情况下,重新使用列表是有意义的。但事实上,这会让事情变得更糟。因此,这些要求应该修改。@OlivierJacot Descombes我完全同意你的观点。非常感谢,这正是我需要的,它很有效:)这个解决方案不是比使用新列表()更糟吗??child.ToList()实际上使用新列表()并通过遍历每个项目并将其复制到列表中来复制项目。因此,这种方法不如简单地使用child=new List();@Tartori我同意,但这是满足OP不使用=new List()的要求的唯一方法
。OP假设列表的行为类似于值类型,即它的内容在父级被复制。添加(子级)
。在这种情况下,重用列表是有意义的。但实际上它会让事情变得更糟。因此这些要求应该修改。@OlivierJacot Descombes我完全同意你的观点。