C# 返回带有分配的所有子级的新列表的函数与返回该列表中未分配的子级的函数

C# 返回带有分配的所有子级的新列表的函数与返回该列表中未分配的子级的函数,c#,C#,我正试图找到一种方法,在不创建垃圾分配的情况下迭代对象的所有子对象(包括子对象的子对象) 我以前使用的函数是一个返回列表的递归函数 现在我有两个函数,一个返回计数,另一个获取某个索引处的子级 我觉得有更好的方法可以遍历对象的所有子对象 下面是比较递归列表和递归计数+getAt(索引)的示例代码 有孩子的公共课 { 私人MyClassWithChildren[]m_儿童; //分配 公共IReadOnlyList GetAllChildren(bool includeThis=false) {

我正试图找到一种方法,在不创建垃圾分配的情况下迭代对象的所有子对象(包括子对象的子对象)

我以前使用的函数是一个返回列表的递归函数

现在我有两个函数,一个返回计数,另一个获取某个索引处的子级

我觉得有更好的方法可以遍历对象的所有子对象

下面是比较递归列表和递归计数+getAt(索引)的示例代码


有孩子的公共课
{
私人MyClassWithChildren[]m_儿童;
//分配
公共IReadOnlyList GetAllChildren(bool includeThis=false)
{
var allChildren=新列表();
如果(包括此项){
所有儿童。添加(此);
}
if(m_Children!=null){
for(int i=0;i
有人知道更好的方法吗? 一个简单的用例是搜索某个对象是否是另一个对象的子对象。 另一种方法是查找具有特定属性值的所有子级


感谢您抽出时间

也许这就是您想要的:

public IEnumerable<MyClassWithChildren> GetAllChildren()
{
    var items = new Queue<MyClassWithChildren>();
    items.Enqueue(this);

    while (items.TryDequeue(out var result))
    {
        yield return result;

        for (var i = 0; i < result.m_children.Length; ++i) // use for instead of foreach to avoid enumerator creation
        {
            items.Enqueue(result.m_children[i]);
        }
    }
}
public IEnumerable GetAllChildren()
{
var items=新队列();
项目。排队(本);
while(items.TryDequeue(out var result))
{
收益结果;
for(var i=0;i
这将在外部循环处理返回值并请求下一个返回值后,计算返回值的子级。这意味着所有子级都是惰性迭代的。如果外部循环将在第一个元素之后停止,则只有该元素已排入结果队列。
m_children
中的枚举数没有开销,因为此代码使用
for
-循环而不是
foreach
-循环


如果需要所有元素的计数,只需使用linq:
GetAllChildren().count()

我会将列表作为参数传递,这样所有递归调用都可以向其中添加项。