2010-04-29 3 views
2

quelle est la meilleure pratique pour casser une boucle? mes idées étaient:condition dans la récursivité - meilleure pratique

Child Find(Parent parent, object criteria) 
{ 
    Child child = null; 

    foreach(Child wannabe in parent.Childs) 
    { 
     if (wannabe.Match(criteria)) 
     { 
      child = wannabe; 
     } 
     else 
     { 
      child = Find(wannabe, criteria); 
     } 

     if (child != null) break; 
    } 

    return child; 
} 

ou

Child Find(Parent parent, object criteria) 
{ 
    Child child = null; 
    var conditionator = from c in parent.Childs where child != null select c; 

    foreach(Child wannabe in conditionator) 
    { 
     if (wannabe.Match(criteria)) 
     { 
      child = wannabe; 
     } 
     else 
     { 
      child = Find(wannabe, criteria); 
     } 
    } 

    return child; 
} 

ou

Child Find(Parent parent, object criteria) 
{ 
    Child child = null; 
    var enumerator = parent.Childs.GetEnumerator(); 

    while(child != null && enumerator.MoveNext()) 
    { 
     if (enumerator.Current.Match(criteria)) 
     { 
      child = wannabe; 
     } 
     else 
     { 
      child = Find(wannabe, criteria); 
     } 
    } 

    return child; 
} 

que pensez vous, de meilleures idées? Je cherche la solution niciest: D

mo

+0

Quelle version de .NET/C# est-ce que cela a besoin de travailler? –

+0

version> = 3.0 :) –

+0

Vous appelez Find de manière récursive dans tous les exemples, cela signifie-t-il que Child hérite de Parent? –

Répondre

8

Child Find(Parent parent, object criteria) 
    { 
     return parent.Childs.Select(  // Loop through the children looking for those that match the following criteria 
      c => c.Match(criteria)   // Does this child match the criteria? 
       ? c       // If so, just return this child 
       : this.Find(c, criteria) // If not, try to find it in this child's children 
     ).FirstOrDefault();     // We're only interested in the first child that matches the criteria or null if none found 
    } 
+0

qui fonctionne? Je le teste. ça a l'air génial :) –

+0

semble fonctionner :) –

+0

@mo LOL! Vous n'aimez pas les multiples déclarations de retour sur la revendication qu'il est difficile de déboguer, mais cela est acceptable? Essayez de passer à travers un débogueur et de voir ce que vous préférez dans quelques mois, lorsque le code n'est pas frais dans votre esprit. :-) – Ants

1

Il n'y a pas besoin pour vous de traiter avec vous-même IEnumerator, si l'option 3 est sorti.

L'option 2 ne fonctionne pas. Il continue sans se soucier de trouver une correspondance, et si le dernier enfant n'est pas un match et que ses enfants ne contiennent pas de correspondance, le résultat sera null même s'il y a eu une correspondance.

L'option 1 semble la plus propre, en supposant que vous vous opposiez à plusieurs instructions return. Linq peut être plus laconique, mais peut être plus difficile à comprendre!

+0

tu as raison :) je vois l'erreur. –

+0

Downvoter soin de commenter pourquoi? –

+0

@mo: Le problème est toujours là avec l'option 2. –

Questions connexes