C#递归迭代嵌套属性列表

6
foreach (TargetObject innerObject1 in complexObject.InnerObjects) { 
    foreach (TargetObject innerObject2 in innerObject1.InnerObjects) { 
        foreach (TargetObject innerObject3 in innerObject2.InnerObjects) { 
           yield return innerObject3;
        } 
        yield return innerObject2;
    } 
    yield return innerObject1;
 }

我该如何递归地做到这一点?我需要将所有嵌套列表中被包含的 TargetObject 实例汇总到一个列表中。下面是一个没有成功的尝试。
 public static IEnumerable<TargetObject> GetRecursively(params TargetObject[] startingObjects) 
    {
        foreach (TargetObject startingObject in startingObjects) 
        {
            foreach (TargetObject innerObject in GetRecursively(startingObject.InnerObjects.ToArray()))
            {
                yield return innerObject;
            }
            yield return startingObject;
        }
    }
1个回答

8

像这样——返回startingObject,并对InnerObjects中的每个项递归调用:

public static IEnumerable<TargetObject> GetRecursively(TargetObject startingObject) 
{
    yield return startingObject;
    if (startingObject.InnerObjects != null)
        foreach (TargetObject innerObject in startingObject.InnerObjects.ToArray())
            foreach (TargetObject recursiveInner in GetRecursively(innerObject))
                yield return recursiveInner;
}

为了支持将数组作为参数,可以在其周围包装一个foreach
public static IEnumerable<TargetObject> GetRecursively2(params TargetObject[] startingObjects)
{
    foreach (TargetObject startingObject in startingObjects)
    {
        yield return startingObject;
        if (startingObject.InnerObjects != null)
            foreach (TargetObject innerObject in startingObject.InnerObjects.ToArray())
                foreach (TargetObject recursiveInner in GetRecursively(innerObject))
                    yield return recursiveInner;
    }
}

值得注意的是,您可以将单个对象传递给params参数,因此数组情况适用于两种情况而无需重载。 - parliament

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接