2013-10-09 5 views
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のすべてのインスタンスを、これらのネストされたリストにトラップして1つのリストに集約する必要があります。ここではうまくいかない試みがあります。C#反復的にネストされたプロパティリストを繰り返し処理する

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; 
     } 
    } 

答えて

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; 
    } 
} 
+1

それは美しいです: ') – parliament

+0

あなたはparamsパラメータに1つのオブジェクトを渡すことができますので、配列の大文字と小文字の両方の場合に働きます。 – parliament

+0

+1崇高なコード! – Rob

関連する問題