Je n'arrive pas à trouver un pointeur dans la bonne direction, je ne suis même pas sûr des termes que je devrais rechercher, mais d'innombrables heures de googling semblent me tourner en rond , si tout va bien, la ruche collective de l'intelligence de Stack Overflow peut aider. Le problème est ceci, j'ai besoin d'un moyen de filtrer des données dans ce que je peux seulement appeler un arbre logique composé. Actuellement, le système implémente un système de filtrage ET simple. Par exemple, disons que nous avons un ensemble de données de personnes. Vous ajoutez un tas de filtres tels que montrer toutes les personnes où (Sexe = Femme) ET (Âge> 23) ET (Âge < 30) ET (Statut = Simple). Assez facile, parcourir chaque élément, ajouter à une collection d'éléments valides seulement si toutes les conditions sont vraies.Besoin d'orientation vers l'arbre logique booléen évaluatif
Le problème que je rencontre est comment puis-je gérer l'utilisateur pouvant construire des requêtes complexes impliquées et est et ou? Je pense à quelque chose comme un arbre où chaque nœud représente et exprime l'évaluation de ses enfants à vrai ou faux. Un exemple simpliste serait - filtrer vers ((Sexe == Homme ET Age == 25) OU (Sexe == Femme ET Statut == Unique)) ET IQ> 120. Désolé, je ne peux pas penser à un meilleur exemple à le moment. Mais comment voulez-vous représenter ce type d'arbre d'expression, et évaluer les éléments d'une collection par rapport à ces filtres. Quelles sont les références qui pourraient aider? L'enfer, quelles sont les recherches foutues de Google qui pourraient mener dans une direction positive ?!
Merci à tous ceux qui peuvent vous aider.
Voici un exemple d'une requête de composé sous forme d'arbre à l'aide d'un ensemble de données de personnes
- Requête - Montrez-moi tous les gens où le sexe est masculin et les yeux verts ou le sexe est une femme, les yeux sont bleus, ou le statut est unique. En forme de Paren (Sexe == Masculin & & Yeux == Vert) || (Sexe == Femme & & (Yeux bleu == || == Statut unique))
Ainsi Sous forme arbre im pensée
o-Root Node
- And - Sex = Male
- And - Eyes = Blue
- Or - Sex = Female
- And Eyes = Blue
- Or Status = Single
Je crois que la solution est de représenter chaque noeud tel dans une structure de données comme
Node
{
OpType - AND or OR
ExpressionField - The field to evaluate
ExpressionOp - =, !=, >, >=, <, <=
ExpressionValue - the value to compare the field's value against
Function Evaluate() - returns a bool
}
donc, pour un noeud donné, évaluer les chilren, si vous êtes un noeud eT, puis retourne true si vos résultats d'expression dans tous les cas et vos enfants eT évaluer true ou tout OR enfant évalue à vrai et recurse.
Semble satisfaire toutes les conditions conceptuelles que je peux y jeter, mais nous le ferons depuis que je l'implémente. Je posterai le code réel plus tard quand son travail et les images pour aider à décrire ce problème mieux pour les autres.
Suggérez-vous de clarifier la forme de vos données: SQL db? Je suppose que le tag "as3" fait référence à ActionScript 3: si oui, cherchez-vous vraiment des techniques spécifiques C# ou AS3, ou juste pour "théorie"? – BillW
Les données sont en mémoire, bien que techniquement la mise en œuvre soit à la fois en flash et en silverlight, je suis beaucoup plus intéressé par la compréhension de la solution générale qu'une implémentation spécifique. Le point crucial du problème consiste à présenter une interface utilisateur à l'utilisateur qui lui permet de générer dynamiquement une requête complexe pour filtrer l'ensemble de données. J'ai besoin d'une structure de données solide pour représenter la requête. Jusqu'à présent, je donne les résultats suivants pour un nœud - Type - Et ou Ou - Champ - le champ de l'ensemble de données ce nœud cible - Opération - =, =,>, < <=, > = - Valeur - la valeur pour appliquer l'opération contre – JTtheGeek
Explication plus claire! Je vous suggère de clarifier si la structure de données est en C#/SilverLight: si c'est le cas, je suppose que vous utiliserez Linq pour faire le "lifting". Si vous êtes déjà à un niveau élevé avec Linq, en utilisant des lambdas, des méthodes anonymes, etc., c'est une chose: si vous n'êtes pas, vous pouvez obtenir de bons conseils sur SO (si vous le demandez) sur les ressources d'étude Linq (imho Jon "C# in Depth" de Skeet est le meilleur livre C# de la planète avec une superbe couverture de Linq). Cela peut être sans rapport avec votre idée, mais vous pouvez utiliser un dictionnaire avec "any" en tant que clés et des méthodes exécutables (anonymes) en tant que Values. - BillW – BillW