Question

Je ne peux pas l'air de trouver un pointeur dans la bonne direction, je ne suis même pas sûr de ce que les termes sont que je devrais, mais des recherches sur d'innombrables heures de googler semble être me tourner en rond, alors je espère que la ruche collective de l'intelligence de débordement de la pile peut aider.

Le problème est, je besoin d'un moyen de filtrer les données dans ce que je ne peux appeler un arbre logique composé. Actuellement, le système met en œuvre un système simple et de filtrage. Par exemple, disons que nous avons un ensemble de données de personnes. Vous ajoutez un tas de filtres tels que montrent toutes les personnes où (sexe = féminin) et (âge> 23) ET (Age <30) et (Status = Simple). Assez facile, itérer chaque élément, ajouter à une collection d'éléments valables que si chaque condition est vraie.

Le problème que je rencontre est de savoir comment puis-je gérer l'utilisateur étant en mesure de construire des requêtes complexes en jeu et de et ou de? Je pense à quelque chose comme un arbre où chaque noeud représente et évaluer l'expression de ses enfants à vrai ou faux. Un exemple simpliste serait - filtre jusqu'à ((sexe == Homme et l'âge == 25) OU (Sexe == == Femme et le statut unique)) et le QI> 120. Désolé, je ne peux pas penser à un meilleur exemple à le moment. Mais comment feriez-vous de représenter ce type d'arbre d'expression, et d'évaluer les éléments d'une collection contre ces filtres. Quelles sont quelques références qui pourraient aider? L'enfer, ce sont quelques-uns sacrément Google recherche qui pourrait mener dans une direction positive?

Merci à tous ceux qui peuvent apporter une aide.

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 un homme et les yeux sont verts ou le sexe est une femme, les yeux sont bleus, ou le statut est unique. Sous forme Paren (Sexe == == Yeux de Homme Vert) || (Sexe == Femme && (Yeux bleu == || == Statut unique))

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 consiste à représenter chaque noeud comme 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 revenez vrai si vos résultats d'expression dans vrai et tous vos et les enfants évaluent true ou tout OU enfant évalue à vrai et récursifs vers le haut.

Semble pour satisfaire toutes les conditions conceptuelles que je peux jeter, mais nous allons car une fois que je le mettre en œuvre. Je vais poster le code réel plus tard lorsque son travail et des images pour aider à décrire ce problème mieux pour les autres.

Était-ce utile?

La solution

Votre analyse syntaxique de l'expression ((sexe == Homme et l'âge == 25) OU (Sexe == == Femme et le statut unique)) et le QI> 120 semble étrange. Je l'analyser comme:

* And
    * Or
        * And
            * ==
                * Sex
                * Male
            * ==
                * Eyes
                * Blue
        * And
            * ==
                * Sex
                * Female
            * ==
                * Status
                * Single
    * >
        * IQ
        * 120

Le type d'arbre serait:

Node
{
    bool evaluate ()
}

AndNode : Node
{
    Node left
    Node right

    bool evaluate ()
    {
        return left.evaluate () && right.evaluate ()
    }
}

// OrNode is similar

EqualsNode : Node
{
    Field field
    Value value

    bool evaluate ()
    {
        return field.value () == value
    }
}

// Likewise for <, >, etc

Autres conseils

Ces types de requêtes sont souvent présentées comme un tableau ORed des clauses ANDed. C'est, sous forme de tableau dans lequel vous avez lu dans plusieurs conditions ANDed ensemble, puis lisez à eux OR. Cela conduit à une répétition des conditions, mais il est facile pour les utilisateurs à lire, écrire et comprendre. Votre échantillon ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120 ressemblerait

Sex == Male   & Age == 25        & IQ > 120 
Sex == Female & Status == Single & IQ > 120 

Vous pouvez Google pour des termes tels que « calcul des prédicats » et «forme normale conjonctive.

Je dois dire que c'est pourquoi les moteurs de base de données sont construits. Vous pouvez faire tout ce que vous avez besoin avec la logique de jeu et vous pouvez même arriver au résultat que vous recherchez, mais les thèses sont des problèmes standards résolus par les bases de données et SQL. Vous pouvez également consulter LINQ pour en solution de code.

On dirait que vous devez créer une interface utilisateur qui permet la création d'un simple, arbre d'analyse syntaxique. Lorsque les presses GO vous pouvez alors parcourir l'arborescence et créer un arbre d'expression LINQ de cette structure de l'interface utilisateur. Exécutez la requête LINQ, puis traiter les résultats en fonction des besoins. Je voudrais donc vous recommandons de lire sur les arbres d'expression LINQ.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top