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

Bunu nasıl imleç olarak yapabilirim? Bu iç içe geçmiş listelenen sıkışmış TargetObject tüm örneklerini tek bir listeye toplamalıyım. İşte çalışmayan bir girişim.C# iç içe geçmiş özellik listelerini yinelemeli olarak yineleme

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

cevap

8
Bunun gibi

- verim startingObject ve InnerObjects her bir öğe için yinelemeli çağrı:

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

parametre olarak bir dizi desteklemek için, onun etrafında bir foreach sarın:

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

güzel: ') – parliament

+0

tek bir nesneyi params parametresine iletebileceğinizi belirterek, dizi durumu her iki durumda da aşırı yüklenmeden çalışacaktır. – parliament

+0

+1 Takım kodu! – Rob

İlgili konular