Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中重用列表?_C#_List - Fatal编程技术网

如何在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我完全同意你的观点。