2013-10-09 11 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; 
} 

Wie kann ich dies kursiv machen? Ich muss alle Instanzen von TargetObject, die in diesen verschachtelten Listen zusammengefasst sind, in einer Liste zusammenfassen. Hier ist ein Versuch, der nicht funktioniert hat.C# rekursiv über verschachtelte Eigenschaftslisten iterieren

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

Antwort

8

so - Ausbeute startingObject, und für jedes Element rekursiv rufen in 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; 
} 

Um ein Array als Parameter zu unterstützen, wickeln eine foreach herum:

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

es ist schön: ') – parliament

+0

erwähnenswert Sie können ein einzelnes Objekt an Parameter Parameter übergeben, so dass die Array-Fall in beiden Fällen ohne Überlastung funktioniert. – parliament

+0

+1 Erhabenes Stück Code! – Rob