2010-11-06 7 views
3

J'écris un plugin pour un autre logiciel que nous utilisons dans mon bureau et qui permettra aux utilisateurs de vérifier les fichiers sur lesquels ils travaillent. J'essaie de garder mon outil aussi flexible que possible. L'idée que j'ai est que l'utilisateur va générer un arbre de nœuds pouvant contenir d'autres nœuds en tant que sous-nœuds. En bas de l'arborescence, les nœuds seront des nœuds de condition qui échoueront ou passeront en fonction du fichier dans lequel l'utilisateur travaille. En outre, l'utilisateur peut définir chaque nœud sur un type de logique spécifique comprenant AND, OR, NOR, NAND .Quelle est la manière la plus efficace d'effectuer des opérations logiques booléennes dans C# .NET?

AND: All sub nodes must pass 
OR: At least one sub node must pass 
NAND: At least one sub node must fail 
NOR: All sub nodes must fail 

Ce que je suis en train de comprendre est maintenant si j'ai une collection de années bool qui ont été retournés par un nœud ou d'un sous-noeud, ce qui est la façon la plus efficace d'appliquer les types logiques ci-dessus à cette liste ? En dehors de la main j'ai commencé à écrire foreach déclarations, mais il semble que la logique binaire est si fondamentale à la façon dont les ordinateurs fonctionnent, il y aurait une meilleure, plus rapide, et moins itérative méthode.

+2

Vous avez NAND et NOR arrière. –

+0

Ah oui merci de l'avoir signalé. Je le répare. –

Répondre

5

Linq est votre ami:

var booleans = new List<bool> { true, true, false, true }; 

bool allPass = booleans.All(p => p); 
bool anyPass = booleans.Any(p => p); 
bool allFail = booleans.All(p => !p); 
bool anyFail = booleans.Any(p => !p); 

Cela a vraiment encore fait juste un foreach, mais ils sont beaucoup plus compacts et les opérations All et Any correspondent à ce dont vous avez besoin. Le p => p est un lambda qui renvoie un booléen. Si par exemple vous vérifiez les nœuds qui ont une méthode DoesThisPass, vous réécrire les contrôles comme celui-ci:

bool allPass = nodes.All(p => p.DoesThisPass()); 
bool anyPass = nodes.Any(p => p.DoesThisPass()); 
bool allFail = nodes.All(p => !p.DoesThisPass()); 
bool anyFail = nodes.Any(p => !p.DoesThisPass()); 
+0

Ahh ha! ..Merci beaucoup plus propre que ce que j'essayais de faire. –

+0

De rien. –

+0

J'entends dire qu'il y a des rumeurs sur les internets (merci GW Bush) que LINQ peut être lent pour des raisons non évidentes dans certaines situations. Ce que ces situations englobent je ne sais pas. Recommande d'essayer cette approche et d'évaluer les vitesses relatives de ceci et une méthode itérative «maladroite». –

Questions connexes