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中实例化一个新列表#_C#_List_Generics_Recursion - Fatal编程技术网

C# 从树中递归返回一个列表,而不必每次在C中实例化一个新列表#

C# 从树中递归返回一个列表,而不必每次在C中实例化一个新列表#,c#,list,generics,recursion,C#,List,Generics,Recursion,我在一个四叉树中创建了一个方法,它返回一个矩形列表,其中矩形结构表示四叉树。问题是,正如您在下面所看到的,我需要在每次调用中实例化一个新列表,如果可能的话,我希望避免它,因为我认为它在每1/30到1/60秒调用一次时对性能有很大影响(一个游戏循环) 有什么方法可以实现我的要求吗?声明,但不要在更广泛的范围内实例化,可能是在类级别: List<Rectangle> list; 列表; 然后在GetQuads方法中执行以下操作: if (list == null) {list = n

我在一个四叉树中创建了一个方法,它返回一个矩形列表,其中矩形结构表示四叉树。问题是,正如您在下面所看到的,我需要在每次调用中实例化一个新列表,如果可能的话,我希望避免它,因为我认为它在每1/30到1/60秒调用一次时对性能有很大影响(一个游戏循环)


有什么方法可以实现我的要求吗?

声明,但不要在更广泛的范围内实例化,可能是在类级别:

List<Rectangle> list;
列表;
然后在GetQuads方法中执行以下操作:

if (list == null) {list = new List<Rectangle> ();}
if(list==null){list=newlist();}

只需将递归代码移动到带有附加参数的私有方法,然后从公共方法调用它:

public List<Rectangle> GetQuads()
{
    var list = new List<Rectangle> ();
    AddQuads(list);
    return list;
}

private void AddQuads(List<Rectangle> list)
{
    if(this.HasChilds)
    {
        foreach(QuadTree node in this.Nodes)
        {
            node.AddQuads(list);
        }
    }
    list.Add(this.Bounds);
}
公共列表GetQuads()
{
var list=新列表();
AddQuads(列表);
退货清单;
}
私有void AddQuads(列表)
{
如果(这个HasChilds)
{
foreach(此.Nodes中的四叉树节点)
{
node.AddQuads(列表);
}
}
list.Add(this.Bounds);
}

然而,如果你真的想“动态”工作,你根本不应该使用
List
,而应该使用一个树迭代器,例如来自的迭代器。通过这种方式,您还可以通过
Bounds

以外的其他属性选择/筛选/排序等。很少有好的理由返回
列表
,而不是
ICollection
IEnumerable
谢谢,我将实现这种方法,但不是将列表声明到方法中,而是将它声明到我的类中,并按照@nicomp的建议为第一个实例化检查null。顺便说一句,我没有任何真正的理由使用这个列表,所以我会检查这个链接,谢谢你提供的信息。不客气。请注意,如果修改树,类字段会变得不同步,这有点危险。在类级别声明列表是一个很好的观点,但仅此一点是不够的,因为我需要在调用之间自动清除列表,我只能通过将我的方法一分为二来实现,正如@Ivan Stoev所说的。
if (list == null) {list = new List<Rectangle> ();}
public List<Rectangle> GetQuads()
{
    var list = new List<Rectangle> ();
    AddQuads(list);
    return list;
}

private void AddQuads(List<Rectangle> list)
{
    if(this.HasChilds)
    {
        foreach(QuadTree node in this.Nodes)
        {
            node.AddQuads(list);
        }
    }
    list.Add(this.Bounds);
}